简而言之:是否有功能在Tkinter中获取小部件主框架的名称?
让我再告诉你一点:
有一个名为“BackButton”的按钮
self.BackButton = Button(self.SCPIFrame, text = "Back", command = self.CloseFrame)
self.BackButton.place(x = 320, y = 320, anchor = CENTER)
当我点击这个按钮时,有一个名为“CloseFrame”的函数,它关闭当前的Frame(以及做其他一些事情),在这种情况下是“SCPIFrame”。但为此,我需要Frame的名称,其中存在BackButton。 有任何想法吗?谢谢你的帮助。
答案 0 :(得分:5)
直接回答你的问题:
是否有一个函数来获取窗口小部件的主框架的名称 Tkinter的?
winfo_parent
正是您所需要的。为了有用,您可以将它与_nametowidget
结合使用(因为winfo_parent
实际上返回了父级的名称。)
parent_name = widget.winfo_parent()
parent = widget._nametowidget(parent_name)
答案 1 :(得分:2)
我认为最好的方法是使用.master属性,它实际上就是master的实例:) 例如(我在IPython中这样做):
import Tkinter as tk
# We organize a 3-level widget hierarchy:
# root
# frame
# button
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button = tk.Button(frame, text="Privet!", background='tan')
button.pack()
# Now, let's try to access all the ancestors
# of the "grandson" button:
button.master # Father of the button is the frame instance:
<Tkinter.Frame instance at 0x7f47e9c22128>
button.master.master # Grandfather of the button, root, is the frame's father:
<Tkinter.Tk instance at 0x7f47e9c0def0>
button.master.master.master # Empty result - the button has no great-grand-father ;)
答案 2 :(得分:1)
如果使用面向对象的编程风格,主框架可以是对象本身,也可以是对象的属性。例如:
class MyApplication(tk.Tk):
...
def close_frame(self):
# 'self' refers to the root window
以非OO方式解决此问题的另一种简单方法是将主数据存储在全局窗口中(对于非常小的程序可以正常工作,但不推荐用于必须随时间维护的任何内容),或者可以将其传递给回调。例如:
self.BackButton = Button(..., command=lambda root=self.SCPIFrame: self.close_frame(root))
...
def CloseFrame(self, root):
# 'root' refers to whatever window was passed in