我想在我的窗口中打开一个新窗口并关闭上一个窗口。是否可以让一个按钮同时执行这两个操作?我已经尝试过以下代码,但它没有工作,只是告诉我窗口没有定义:
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()
答案 0 :(得分:2)
首先,您需要从第一个函数返回窗口对象:
null
然后,您需要将窗口作为参数传递给您的函数:
def window1():
window = tkinter.Tk()
tkinter.Button(window, text = "Next", command = lambda: window2(window)).pack()
window.mainloop()
return window
然后使用:
调用window1def 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
”就可以解决它。