我无法在os x

时间:2017-03-15 21:10:23

标签: python macos python-3.x tkinter

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

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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()