Как получить имя мастер-фрейма в Tkinter


Короче говоря: есть ли функция для получения имени главного фрейма виджета в Tkinter?

Позвольте мне рассказать вам немного больше:
Существует кнопка с именем "BackButton".

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

Когда я нажимаю на эту кнопку, появляется функция «CloseFrame», которая закрывает текущий фрейм (и выполняет некоторые другие действия), в данном случае «SCPIFrame». Но для этого мне нужно имя Фрейма, в котором присутствует BackButton. Любые идеи? Спасибо за помощь.


person eljobso    schedule 15.10.2012    source источник


Ответы (3)


Чтобы буквально ответить на ваш вопрос:

Есть ли функция для получения имени главного фрейма виджета в Tkinter?

winfo_parent это именно то, что вам нужно. Чтобы быть полезным, вы можете использовать его в сочетании с _nametowidget (поскольку winfo_parent фактически возвращает имя родителя).

parent_name = widget.winfo_parent()
parent = widget._nametowidget(parent_name)
person FabienAndre    schedule 15.10.2012
comment
Когда я пытаюсь напечатать родительское имя кнопки BackButton, я получаю число: .33500616. self.parent_name = self.BackButton.winfo_parent() print self.parent_name - person eljobso; 22.10.2012
comment
Это число является именем переменной Tcl. _nametowidget извлекает соответствующий экземпляр Tkinter. Говорить об имени объекта немного сомнительно, поскольку с этим объектом может быть связано много переменных. Однако мы находимся в случае, когда косвенное обращение Tkinter поверх Tcl предоставляет уникальное name в качестве имени переменной Tcl. - person FabienAndre; 22.10.2012

Я думаю, что лучший способ - использовать атрибут .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 ;) 
person Benkevitch    schedule 23.02.2017

Если вы используете объектно-ориентированный стиль программирования, мастер-фрейм является либо самим объектом, либо атрибутом объекта. Например:

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
person Bryan Oakley    schedule 15.10.2012