2016-11-25 81 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在代码驴。

相关问题