ventanas ventana una hijas eventos ejemplos con como cerrar botones abrir python class tkinter destroy

ventana - eventos con botones en python



Código de ejemplo de Tkinter para varias ventanas, ¿por qué los botones no se cargarán correctamente? (4)

Estoy escribiendo un programa que debería:

  1. Abra una ventana con solo presionar un botón.
  2. Cierre la ventana recién abierta con solo presionar otro botón.

Estoy usando clases para poder insertar el código en un programa más grande más tarde. Sin embargo, no puedo hacer que mis botones se carguen correctamente.

import tkinter as tk class Demo1(tk.Frame): def __init__(self): tk.Frame.__init__(self) self.pack() self.master.title("Demo 1") self.button1 = tk.Button(self, text = "Button 1", width = 25, command = self.new_window) self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S) def new_window(self): self.newWindow = Demo2() class Demo2(tk.Frame): def __init__(self): new = tk.Frame.__init__(self) new = tk.Toplevel(self) new.title("Demo 2") new.button = tk.Button(text = "Button 2", width = 25, command = self.close_window) new.button.pack() def close_window(self): self.destroy() def main(): Demo1().mainloop() if __name__ == ''__main__'': main()


Lo que podría hacer es copiar el código de tkinter.py en un archivo llamado mytkinter.py , luego haga este código:

import tkinter, mytkinter root = tkinter.Tk() window = mytkinter.Tk() button = mytkinter.Button(window, text="Search", width = 7, command=cmd) button2 = tkinter.Button(root, text="Search", width = 7, command=cmdtwo)

¡Y tienes dos ventanas que no colisionan!


Necesita especificar el maestro para el segundo botón. De lo contrario, se empacará en la primera ventana. Esto es necesario no solo para Button , sino también para otros widgets y objetos no gui como StringVar .

Demo2 rápida: agregue el marco new como primer argumento a su Button en Demo2 .

Posiblemente mejor: actualmente tienes Demo2 heredando de tk.Frame pero creo que esto tiene más sentido si cambias Demo2 para que sea algo como esto,

class Demo2(tk.Toplevel): def __init__(self): tk.Toplevel.__init__(self) self.title("Demo 2") self.button = tk.Button(self, text="Button 2", # specified self as master width=25, command=self.close_window) self.button.pack() def close_window(self): self.destroy()

Solo como sugerencia, solo debe importar tkinter una vez. Elija una de sus primeras dos declaraciones de importación.


Reescribí tu código de una manera más organizada y mejor practicada:

import tkinter as tk class Demo1: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.button1 = tk.Button(self.frame, text = ''New Window'', width = 25, command = self.new_window) self.button1.pack() self.frame.pack() def new_window(self): self.newWindow = tk.Toplevel(self.master) self.app = Demo2(self.newWindow) class Demo2: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.quitButton = tk.Button(self.frame, text = ''Quit'', width = 25, command = self.close_windows) self.quitButton.pack() self.frame.pack() def close_windows(self): self.master.destroy() def main(): root = tk.Tk() app = Demo1(root) root.mainloop() if __name__ == ''__main__'': main()

Resultado:


#!/usr/bin/env python import Tkinter as tk from Tkinter import * class windowclass(): def __init__(self,master): self.master = master self.frame = tk.Frame(master) self.lbl = Label(master , text = "Label") self.lbl.pack() self.btn = Button(master , text = "Button" , command = self.command ) self.btn.pack() self.frame.pack() def command(self): print ''Button is pressed!'' self.newWindow = tk.Toplevel(self.master) self.app = windowclass1(self.newWindow) class windowclass1(): def __init__(self , master): self.master = master self.frame = tk.Frame(master) master.title("a") self.quitButton = tk.Button(self.frame, text = ''Quit'', width = 25 , command = self.close_window) self.quitButton.pack() self.frame.pack() def close_window(self): self.master.destroy() root = Tk() root.title("window") root.geometry("350x50") cls = windowclass(root) root.mainloop()