我需要能够清除所有对象的tkinter窗口(带有函数),然后使用函数再次创建对象。但是,我无法使用第二个函数访问使用第一个函数创建的对象。我在下面重新创建了我的问题。
import tkinter
window = tkinter.Tk()
def create():
test = tkinter.Button(window, text="Example", command=delete)
test.place(x=75, y=100)
def delete():
test.place_forget()
create()
window.mainloop()
这会返回错误 - NameError: name 'test' is not defined
答案 0 :(得分:2)
以下是使用面向对象结构的代码外观的快速示例:
import tkinter as tk
class MyApp: # No need to inherit 'object' in Python 3
def __init__(self, root):
self.root = root
def create_button(self):
self.test_button = tk.Button(self.root,
text="Example",
command=self.delete_button)
self.test_button.place(x=75, y=100)
def delete_button(self):
self.test_button.place_forget()
def run(self):
self.create_button()
self.root.mainloop()
if __name__=='__main__':
root = tk.Tk()
app = MyApp(root)
app.run()
您创建一个“拥有”该按钮的MyApp
对象,并且具有明确处理其拥有的内容的方法。 MyApp
对象的任何方法都通过自动发送的self
参数引用各种小部件。
这是比以前更多的代码,说实话,对于你的代码现在所做的事情,这是一个过度杀伤力。 Malik使用global
的解决方案可能很好。但是,如果你想添加更多的小部件,将它们分层,让它们以更复杂的方式进行交互等,那么使用global
可能会引入难以发现的错误,并且让你难以理解它的内容。继续。
我见过的任何对Tkinter的重要使用都使用了类似于上面例子的面向对象的风格。
顺便说一句,我不会创建delete
函数 - 在创建按钮后使用.config
方法设置命令会更好:
def create_button(self):
self.test_button = tk.Button(self.root, text="Example")
self.test_button.config(command=self.test_button.place_forget)
self.test_button.place(x=75, y=100)
使用.config
可以设置命令,这些命令是您刚创建的按钮的方法,当您将命令设置为按钮实例化的一部分时,您无法执行此操作。
答案 1 :(得分:0)
如果您使用两种不同的功能,那么您需要global
个变量:
import tkinter
window = tkinter.Tk()
test = None
def create():
global test
test = tkinter.Button(window, text="Example", command=delete)
test.place(x=75, y=100)
def delete():
global test
test.destroy() # or place_forget if you want
window.after(5000, create) # button reappears after 5 seconds
create()
window.mainloop()
您的delete
函数无法销毁该按钮,因为它仅在create
函数中定义。解决方法是创建一个可由两者访问的全局变量。