Как получить имя виджета с помощью функции tkinter nametowidget в классе - PullRequest
1 голос
/ 07 февраля 2020

Я пишу мини-проект tkinter в классе и в настоящее время пытаюсь получить имя виджета кнопки, но я получаю сообщение об ошибке трассировки каждый раз, когда я пытаюсь запустить программу. Мне было интересно узнать, как go исправить строку nametowidget, чтобы получить правильное имя виджета.

from tkinter import *
import tkinter.messagebox
root = Tk()
class WindowPane(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.master = master
        self.WindowWidget()

    def WindowWidget(self):
        self.stringer = StringVar()
        self.button1 = Button(text = "Click me")
        self.button1.place(x=200,y=50)
        print(self.master.nametowidget(".button1"))
root.geometry("200x200")
playback = WindowPane(root)
root.mainloop()

1 Ответ

1 голос
/ 07 февраля 2020

«Имя» в nametowidget не является именем переменной, используемой для хранения ссылки на виджет (ie: в этом примере это , а не «button1»). Это имеет смысл, поскольку вы можете иметь несколько переменных, указывающих на один и тот же объект - как бы python узнало, какое имя вы хотите?

Имя относится к внутреннему имени виджета, используемому встроенным интерпретатором tcl / tk. Обычно это вычисляется на основе имени родителя, класса виджета и необязательного номера. Например, первый кадр, который вы создаете по умолчанию, будет иметь имя .!frame, следующий кадр будет иметь имя .!frame2 и т. Д. Первая кнопка внутри первого кадра будет называться .!frame1.!button1, et c.

. Вы можете увидеть имя любого виджета, распечатав его строковое представление. Например, в вашем коде вы можете сделать print(str(self.button1), который покажет вам, что имя на самом деле .!button

Вы не можете использовать что-либо встроенное в tkinter, чтобы преобразовать строку типа "button1" в актуальный виджет. Однако такая переменная, как self.button1, является атрибутом текущего объекта, поэтому вы можете использовать встроенную функцию python getattr, чтобы получить значение атрибута с заданным именем.

В вашем случае вы можете использовать getattr(self, "button1"), чтобы получить ссылку на фактический объект виджета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...