4


长话短说:在 Tkinter 中是否有获取小部件主框架名称的功能?

让我再告诉你一点:
有一个按钮,名为“BackButton”

self.BackButton = Button(self.SCPIFrame, text = "Back", command = self.CloseFrame)
self.BackButton.place(x = 320, y = 320, anchor = CENTER)

当我单击此按钮时,有一个名为“CloseFrame”的函数,它关闭当前帧(并做一些其他事情),在本例中为“SCPIFrame”。但为此,我需要 Frame 的名称,其中存在 BackButton。有任何想法吗?感谢您的帮助。

4

3 回答 3

11

我认为最好的方法是使用 .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 ;) 
于 2017-02-23T20:21:07.080 回答
8

从字面上回答你的问题:

是否有获取 Tkinter 中小部件主框架名称的功能?

winfo_parent正是您所需要的。为了有用,您可以将它与_nametowidget(因为winfo_parent实际上返回父级的名称)结合使用。

parent_name = widget.winfo_parent()
parent = widget._nametowidget(parent_name)
于 2012-10-15T15:27:34.553 回答
2

如果您使用面向对象的编程风格,主框架要么是对象本身,要么是对象的属性。例如:

class MyApplication(tk.Tk):
    ...
    def close_frame(self):
        # 'self' refers to the root window

以非 OO 方式解决此问题的另一种简单方法是将 master 存储在全局窗口中(适用于非常小的程序,但不推荐用于必须随时间维护的任何内容),或者您可以传递它进入回调。例如:

self.BackButton = Button(..., command=lambda root=self.SCPIFrame: self.close_frame(root))
...
def CloseFrame(self, root):
    # 'root' refers to whatever window was passed in
于 2012-10-15T11:16:33.657 回答