我正在学习带Tkinter的Python,最近我了解了引用和小部件名称/实例之间的区别。该引用是您分配给窗口小部件的字符串(以后可以更改),但是名称似乎是窗口小部件的实际身份(不可变)。从本质上讲,该引用似乎是小部件的昵称,因为它可以随着时间的变化而变化,并且取决于您与之交谈的人而不同,而小部件的驾驶执照上的小部件的实际名称始终是相同的。具体来说,在这一行代码中……
sample_frame = Frame(root, name = 'frame1', bg = 'blue', height = 50, width = '50')
“样本框架”是参考,而“ frame1”是名称。
除非我专门将字符串“ frame1”指定为该框架的名称,否则python自动生成一个数字序列作为其名称。为了查看任何小部件的名称,您只需要添加...
print(str(sample_frame))
(the output in this example is .frame1)
因此,在Tkinter中,如果我想将此框架放置在GUI中,则必须像下面这样打包/网格/放置在以下行中...
sample_frame.pack()
但是我想做的是通过此框架小部件的名称而不是其引用来调用pack方法。像这样...
frame1.pack() #or
.frame1.pack() #because of that period
问题在于Python声称从未定义frame1,而.frame1是无效的语法。有人知道该怎么做吗?谢谢。
对于更广泛的上下文,我这样做是因为我重复了21个不同帧的创建并将它们放置在3x7网格中。因此,所有21个帧都有相同的引用。但是,我要确保每个帧的名称与它的位置相对应。
答案 0 :(得分:3)
name=
选项在实际实现GUI的Tcl环境中设置窗口小部件的名称-在Python端不起作用。我能想到的唯一原因是,这可能会使Tcl错误消息更易于阅读(否则,您将获得的自动生成的小部件名称并不是特别有意义)。
与往常一样,处理循环中创建的多个对象的正确方法是将它们存储在某种容器中。在您的情况下,它可能是21个元素的列表,嵌套列表(widget[row][column]
)或由元组索引的字典(widget[row, column]
)。
答案 1 :(得分:1)
虽然我完全同意jasonharper's answer,但您应该正确引用这些小部件,但我不建议您使用我要解释的内容,实际上 是一种实现您的要求。有一个名为nametowidget()
的窗口小部件方法,当您为其命名时,它会返回该窗口小部件对象。请注意,您应该在包含您要查找的小部件的对象(Tk
,Toplevel
,Frame
)上调用方法。
因此,按照您的示例,此方法有效:
from tkinter import *
root = Tk()
sample_frame = Frame(root, name = 'frame1', bg = 'blue', height = 50, width = '50')
root.nametowidget('frame1').pack()
root.mainloop()
如果要对框架内的按钮执行相同操作,则应该这样做:
sample_button = Button(sample_frame, text='Button', name='button1')
sample_frame.nametowidget('button1').pack()