通过名称访问窗口的子窗口小部件?

2024-09-29 02:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python/tkinter中,有没有方法可以访问通过变量名引用的子元素,而不是从另一个函数访问它们?在

例如,在VBA中,可以通过名称直接引用另一个窗口的元素。 例如,如果我有两个窗口,UserForm1UserForm2我可以通过单击UserForm1上的按钮来更改Label1的文本值。在

Private Sub CommandButton1_Click()
  UserForm2.Label1.Caption = "Changed"
End Sub

在tkinter中,我找到了访问子元素的winfo_children()。有没有办法通过他们的名字找到他们?在

请参阅下面的示例代码:

^{pr2}$

Tags: 方法函数文本名称元素tkinterprivatevba
2条回答

winfo_children()返回与小部件类型相关联的class实例以及tkinter分配给实际tk对象的名称。在

这意味着是的,我们可以引用widget的名称,尽管我不确定除了不需要将标签赋给变量之外,这会给您带来什么好处。在

from tkinter import *

root = Tk()

Label(root, text="Label1").pack()
label2 = Label(root, name="name", text="Label2")

label2.pack()

print(root.winfo_children())
print(root.nametowidget('.!label'))
print(str(label2))

Button(root, text="Delete label2", command=lambda: root.nametowidget(".name").destroy()).pack()

上述操作将导致窗口中出现两个Label小部件和一个Button小部件。第一个Label没有存储在变量中,但是我们可以很高兴地在print语句中调用它。第二个存储在一个变量中,但是您可以看到在Buttoncommand中,我们引用的不是这个变量,而是Label的name属性。在

Bryan Oakley has a fantastic answer here explaining this.

我不太清楚你说的“名字”是什么意思:

"Is there any way in Python/tkinter to access child elements referring by their names?"

您可以简单地通过对象引用访问小部件:

# Procedural
import tkinter as tk


def change():
    object_reference['text'] = "Changed!"

root = tk.Tk()
object_reference = tk.Label(root, text="This is a label for root-window")
object_reference.pack()

another_window = tk.Toplevel(root)
btn_in_other_window = tk.Button(another_window, text="Change")
btn_in_other_window['command'] = change
btn_in_other_window.pack()

root.mainloop()

或者,如果要用更多面向对象的方法定义它们,可以使用.(点)表示法:

^{pr2}$

相关问题 更多 >