如何获得Tkinter的主框架的名称(How to get the name of the Mast

2019-10-17 07:41发布


削减长话短说:有没有一个函数来获得Tkinter的小部件的主框架的名称?

让我告诉你一点点:
有一个按钮,命名为“后退按钮”

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

当我点击这个按钮,有一个名为“CloseFrame”功能,关闭当前帧(和做一些其他的东西),在这种情况下,“SCPIFrame”。 但对于这一点,我需要的框架,其中的返回按钮存在的名称。 有任何想法吗? 感谢您的帮助。

Answer 1:

从字面上回答你的问题:

是否有一个函数来获得Tkinter的小部件的主框架的名称?

winfo_parent正是你所需要的。 为了有用,你可以用它与联合_nametowidget (因为winfo_parent实际返回父母的名字)。

parent_name = widget.winfo_parent()
parent = widget._nametowidget(parent_name)


Answer 2:

我认为最好的方法是使用的.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 ;) 


Answer 3:

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

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

在非面向对象的方式来解决这个问题的另一种简单的办法是,要么存储主在全局窗口(正常工作非常小的程序,但不建议任何将不得不保持一段时间),或者你可以通过它在回调。 例如:

self.BackButton = Button(..., command=lambda root=self.SCPIFrame: self.close_frame(root))
...
def CloseFrame(self, root):
    # 'root' refers to whatever window was passed in


文章来源: How to get the name of the Master Frame in Tkinter