2016-11-25 76 views
0

我正在使用Tkinter在python中編寫程序。我現在的問題是,我有按鈕打開另一個窗口。我的問題是,它不能打開兩個以上的窗口。有想法該怎麼解決這個嗎。Tkinter將不會打開兩個以上的窗口

from tkinter import * 

class first(object): 
    def __init__(self, master): 
     self.master = master 
     self.admin_btn = Button(master, text = "First", command = self.second) 
     self.admin_btn.grid(row = 0, column = 0) 

    def second(self): 
     self.w = second(self.master) 
     self.master.wait_window(self.w.top) 

class second(object): 
    def __init__(self, master): 
     top = self.top = Toplevel(master) 
     self.second = Button(top, text = "Second", command = self.third) 
     self.second.grid(row= 0, column = 0) 

    def third(self): 
     self.w = third(self.master) 
     self.master.wait_window(self.w.top) 

class third(object): 
    def __init__(self, master): 
     top = self.top = Toplevel(master) 
     self.second = Button(top, text = "Third") 
     self.second.grid(row= 0, column = 0) 


if __name__ == "__main__": 
    root = Tk() 
    m = first(root) 
    root.mainloop() 
+0

在控制檯/ termina/cmd.exe/powershell中運行它,當您嘗試打開第三個窗口時看到錯誤消息 – furas

+0

請不要破壞您的帖子。 – SiHa

回答

0

我建議所有的類都是從Toplevel的,而不是對象,這樣一來,繼承所有的類都將有一個master屬性(這就是爲什麼你有一個錯誤,second類沒有之一):

from tkinter import * 

class First(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.admin_btn = Button(self, text = "First", command = self.second) 
     self.admin_btn.grid(row=0, column=0) 

    def second(self): 
     self.w = Second(self) 
     self.wait_window(self.w) 

class Second(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.second = Button(self, text = "Second", command = self.third) 
     self.second.grid(row=0, column=0) 

    def third(self): 
     self.w = Third(self.master) 
     self.wait_window(self.w) 

class Third(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.second = Button(self, text = "Third") 
     self.second.grid(row=0, column=0) 


if __name__ == "__main__": 
    root = Tk() 
    m = First(root) 
    m.lift(root) 
    root.wait_window(m) 
    root.mainloop() 
0

嘗試使用此代碼:

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 = 'First', 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 = 'Second', 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() 

在這段代碼我已經添加了兩個窗戶,但你可以添加第三個。

0

你忘了在第二個窗口

self.master = master 

,當你試圖打開第三個窗口你會得到錯誤信息。

但是你應該寧可分配Toplevel(master)self. master然後用self.master代替self.top

from tkinter import * 


class First(object): 

    def __init__(self, master): 
     self.master = master # = Tk() 
     self.btn = Button(self.master, text="First", command=self.second) 
     self.btn.grid(row=0, column=0) 

    def second(self): 
     self.w = Second(self.master) 
     self.master.wait_window(self.w.master) 


class Second(object): 

    def __init__(self, master): 
     self.master = Toplevel(master) 
     self.btn = Button(self.master, text="Second", command=self.third) 
     self.btn.grid(row=0, column=0) 

    def third(self): 
     self.w = Third(self.master) 
     self.master.wait_window(self.w.master) 


class Third(object): 

    def __init__(self, master): 
     self.master = Toplevel(master) 
     self.btn = Button(self.master, text="Third") 
     self.btn.grid(row=0, column=0) 


if __name__ == "__main__": 
    root = Tk() 
    first = First(root) 
    root.mainloop() 

而現在所有的類看起來非常相似 - 他們有self.master = Tk()self.master = Toplevel(master)


BTW:用CamelCase名稱類 - First,Second,Third - 它有助於識別cl在代碼驢。

相關問題