2013-04-20 8 views
25

Piszę program, który powinien:Przykładowy kod Tkintera dla wielu okien, dlaczego przyciski nie ładują się poprawnie?

  1. Otwórz okno z naciśnięciem przycisku.
  2. Zamknij nowo otwarte okno, naciskając inny przycisk.

Używam klas, więc mogę później wstawić kod do większego programu. Nie mogę jednak poprawnie załadować przycisków.

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() 

Odpowiedz

33

I przepisał swój kod w bardziej zorganizowany, lepiej wprawną sposób:

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() 

Wynik:

Demo1 windowDemo2 window

+0

@ADB to zależy. Ogólnie rzecz biorąc, uruchamiane są dwa 'mainloop()' s na dwóch oknach 'Tk()'. Jednak jeśli chcesz mieć wiele okien, możesz uniknąć dwóch "mainloop()". W ten sposób można użyć widgetu 'Toplevel()', który jest podobny do 'Tk()'. –

+7

Dwa mainloopy nie "polegają" na niczym, a nie jest tylko "patrzy się w dół", to jest złe. Potrzebujesz tylko jednego. Wezwanie do mainloopa to nieskończona pętla, kiedy uruchamiasz więcej niż jeden, masz nieskończoną pętlę wewnątrz nieskończonej pętli. Powinieneś usunąć drugie wywołanie "mainloop" w swoim kodzie (w Demo1.new_window), w przeciwnym razie będzie to mylące dla osób, które próbują nauczyć się korzystać z Tkintera. –

+0

Czy mógłbyś wytłumaczyć 'close_windows()'? Kiedy trzeba to nazwać? – sbhatla

9

Musisz podać wzorzec dla drugiego przycisku. W przeciwnym razie zostanie spakowany do pierwszego okna. Jest to potrzebne nie tylko dla Button, ale także dla innych widżetów i obiektów innych niż GUI, takich jak StringVar.

Szybka poprawka: dodać ramkę new jako pierwszy argument do swojej Button w Demo2.

Być może lepiej: Obecnie masz Demo2 dziedziczy od tk.Frame ale myślę, że to ma większy sens, jeśli zmienisz Demo2 być coś takiego,

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() 

Podobnie jak sugestia, tylko powinien importować tkinter pewnego razu. Wybierz jedną z dwóch pierwszych instrukcji importowania.

2
#!/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() 
Powiązane problemy