如何在另一个函数中关闭tkinter窗口?

时间:2016-05-25 18:14:09

标签: python tkinter

我想在我的窗口中打开一个新窗口并关闭上一个窗口。是否可以让一个按钮同时执行这两个操作?我已经尝试过以下代码,但它没有工作,只是告诉我窗口没有定义:

import tkinter
def window1():
    window = tkinter.Tk()
    tkinter.Button(window, text = "Next", command = window2).pack()
    window.mainloop()
def window2():
    window.destroy() #This is where the error is
    menu = tkinter.Tk()
    etc, etc, etc
window1()

4 个答案:

答案 0 :(得分:2)

首先,您需要从第一个函数返回窗口对象:

null

然后,您需要将窗口作为参数传递给您的函数:

def window1():
    window = tkinter.Tk()
    tkinter.Button(window, text = "Next", command = lambda: window2(window)).pack()
    window.mainloop()
    return window

然后使用:

调用window1
def window2(window):
    window.destroy()
    menu = tkinter.Tk()

然后单击按钮将其销毁并完成剩下的工作

答案 1 :(得分:1)

这是使用Toplevels的一个例子,它通常是比创建,销毁,重新创建Tk()实例更好的选择。使用partial()将唯一的Toplevel ID传递给close_it函数。当然,您可以将它们组合在一起,或者使用close函数调用open函数。

try:
    import Tkinter as tk     ## Python 2.x
except ImportError:
    import tkinter as tk     ## Python 3.x

from functools import partial

class OpenToplevels():
    """ open and close additional Toplevels with a button
    """
    def __init__(self):
        self.root = tk.Tk()
        self.button_ctr=0
        but=tk.Button(self.root, text="Open a Toplevel",
                      command=self.open_another)
        but.grid(row=0, column=0)
        tk.Button(self.root, text="Exit Tkinter", bg="red",
                  command=self.root.quit).grid(row=1, column=0, sticky="we")
        self.root.mainloop()

    def close_it(self, id):
        id.destroy()

    def open_another(self):
        self.button_ctr += 1
        id = tk.Toplevel(self.root)
        id.title("Toplevel #%d" % (self.button_ctr))
        tk.Button(id, text="Close Toplevel #%d" % (self.button_ctr),
                  command=partial(self.close_it, id),
                  bg="orange", width=20).grid(row=1, column=0)

Ot=OpenToplevels()

答案 2 :(得分:0)

是。有可能。但你需要 def

def window1:
   blablabla
   blablabla
def window2:
   window2.destroy() <-- Here where the error was

你是如何注意到的,把你想要的窗口名称销毁,它会起作用!

答案 3 :(得分:0)

使用 Python3
您可以使用“全局”,例如:

root = Tk()
root.title('This is the root window')

def window_create():
    global window_one
    window_one = Tk()
    window_one.title('This is window 1')

然后,当您想销毁 window_one 时,从任何函数(或其他地方)执行:

def window_destroyer():
    window_one.destroy()

您可以从任何位置的按钮调用 window_destroyer 函数,例如示例显示的 root:

kill_window_btn = Button(root, text="Destroy", command=window_destroyer).pack()

当然,请遵循您自己的命名约定。 :)
在我看来,只需“global window_one”就可以解决它。