在单独的函数中删除Tkinter对象(在函数中创建)

时间:2015-01-25 00:24:16

标签: python tkinter

我需要能够清除所有对象的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

2 个答案:

答案 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函数中定义。解决方法是创建一个可由两者访问的全局变量。