如何在python中将对象重新分配给变量?

时间:2016-08-15 00:02:35

标签: python tkinter

如果我将一个变量(在本例中为b)分配给一个按钮并将其放在带有pack()的屏幕上,然后将b重新分配给另一种数据类型,我该如何访问该按钮以便可以删除该按钮或以其他方式删除该按钮提到?我想可以询问有关任何数据类型或对象的问题,但这种情况很突出,因为按钮留在屏幕上。例如:

import tkinter as tk

root=tk.Tk()
root.geometry('300x300')

b=tk.Button(root, text="button b")
b.pack()
b=1

root.mainloop()

3 个答案:

答案 0 :(得分:1)

使用其他作业在某处保存引用。

b = tk.Button(root, text="button b")
saved = b
b = 1
saved.pack()

答案 1 :(得分:1)

  

...然后稍后将b重新分配给另一种数据类型,如何访问该按钮以便删除或以其他方式引用?

简短回答:你不能。为了引用某些东西,你必须保留一个参考。话虽如此,tkinter提供了一些替代方案。

如果您想要引用回调中的按钮,可以将其传入。这需要创建按钮,然后在单独的步骤中定义回调:

b = tk.Button(...)
b.configure(command=lambda button=b: do_something)
...
def do_something(button):
    print("the widget is:", button)

此外,如果您正在使用绑定,则在调用绑定函数时,将传递一个事件对象,该对象具有包含对窗口小部件的引用的属性。

b.bind("<1>", do_something)
...
def do_something(event):
    print("the widget is:", event.widget)

最后,您可以向tkinter询​​问子窗口小部件列表(例如:root.winfo_children),如果您知道自己是否已使用packplace或{{ 1}},您可以使用grid方法查询特定容器内管理的所有小部件(例如:slavesroot.grid_slaves()root.pack_slaves()

答案 2 :(得分:1)

您可以使用以下方法访问根窗口的所有小部件:

list_of_widgets = root.pack_slaves()

然后检查对象的类型。 (这不是一个好习惯...) 因此,我建议您将所需的引用保存在separeate对象中,以便从应用程序中清楚地将接口分离到tkinter。从那时起,您应该只通过接口对象访问小部件。这样可以创建更清晰的代码