2017-03-15 52 views
0

当使用python 3.6和tkinter创建第二个窗口时,它不负责任。我使用的是OS X 10.11.6。 在其他系统(如Ubuntu)中,此代码正常工作。我不能使用tkinter在os上创建第二个窗口x

from tkinter import * 

class win2: 

    def __init__(self): 
     self.root = Tk() 
     self.root.mainloop() 

class win1: 

    def __init__(self): 
     self.root = Tk() 

     self.button = Button(self.root) 
     self.button.bind('<Button-1>', self.buttonFunc) 
     self.button.pack() 

     self.root.mainloop() 

    def buttonFunc(self, event): 
     windows2 = win2() 

if __name__ == "__main__": 
    window1 = win1() 
+1

我觉得你正在接近错误的问题。你的tkinter GUI应该只有1个主循环。你的'win2'类没有做任何事情。我建议找到一个简单的tkinter示例并从那里开始工作。另外,PyQt是GUI的另一个选项 –

回答

1

这是一个非常糟糕的主意,多次使用Tk()更在你的程序。使用它来创建根窗口,然后使用Toplevel()来创建任何其他窗口。

def buttonFunc(self, event): 
    Toplevel(self.root) 

这就是说,它仍然看起来像你试图做一些艰难的事情。你能更好地描述你的最终目标是什么吗?

要进行模态窗口(弹出)使用这样的代码:

try: #python3 imports 
    import tkinter as tk 
except ImportError: #python3 failed, try python2 imports 
    import Tkinter as tk 

class Main(tk.Frame): 
    def __init__(self, master=None, **kwargs): 
     tk.Frame.__init__(self, master, **kwargs) 

     lbl = tk.Label(self, text="this is the main frame") 
     lbl.pack() 

     btn = tk.Button(self, text='click me', command=self.open_popup) 
     btn.pack() 

    def open_popup(self): 
     print("runs before the popup") 
     Popup(self) 
     print("runs after the popup closes") 

class Popup(tk.Toplevel): 
    """modal window requires a master""" 
    def __init__(self, master, **kwargs): 
     tk.Toplevel.__init__(self, master, **kwargs) 

     lbl = tk.Label(self, text="this is the popup") 
     lbl.pack() 

     btn = tk.Button(self, text="OK", command=self.destroy) 
     btn.pack() 

     # The following commands keep the popup on top. 
     # Remove these if you want a program with 2 responding windows. 
     # These commands must be at the end of __init__ 
     self.transient(master) # set to be on top of the main window 
     self.grab_set() # hijack all commands from the master (clicks on the main window are ignored) 
     master.wait_window(self) # pause anything on the main window until this one closes 

def main(): 
    root = tk.Tk() 
    window = Main(root) 
    window.pack() 
    root.mainloop() 

if __name__ == '__main__': 
    main() 
+0

我想为我的应用程序创建设置窗口。这里是我的完整代码的链接https://codeshare.io/GqANWx –

+0

这是一个'模态窗口'。我编辑了我的答案,告诉你如何做到这一点。我建议你也按照我的主角进行子类化,而不是像'self.root'这样的属性。 – Novel

+1

@МихайлоПилипишин请不要让人们为你做所有事情,并给他们你的完整代码。这不是什么... – abccd

0

此代码对我的作品。

from tkinter import * 

class win1: 

    def __init__(self): 
     root = Tk() 
     button = Button(root) 
     button.bind('<Button-1>', self.buttonFunc) 
     button.pack() 
     root.mainloop() 

    def buttonFunc(self, event): 
     window2 = win2() 

class win2(win1): 

    def __init__(self): 
     top = Toplevel() 

if __name__ == "__main__": 
    window1 = win1()