Tkinter на тему Python: переменная ввода не будет установлена - PullRequest
2 голосов
/ 16 сентября 2011

Следующий код Python 3 имеет метку и поле ввода, которые правильно инициализируются строкой (в данном случае «мусор»). Но когда вторая строка «import» не закомментирована для замены старого виджета Entry новым тематическим виджетом, поля label и Entry не инициализируются.

Любая подсказка, почему инициализация тематического виджета не работает?


from tkinter import *
# from tkinter.ttk import *

class myApp:
    def __init__(self, root):
        v = StringVar()
        v.set("junk")

        label = Label(root, textvariable=v)
        label.pack()
        text_entry = Entry(root, textvariable=v)
        text_entry.pack()

root = Tk()
root.title("MyApp")
app = myApp(root)
root.mainloop()

1 Ответ

5 голосов
/ 16 сентября 2011

Проблема в том, что v является локальной переменной.Когда он выходит из области видимости (т.е. когда __init__ завершает выполнение), v получает сборщик мусора.Измените v на self.v, и проблема исчезнет.

Почему вы видите проблему с виджетом ttk Entry, а не со стандартным, я не знаю.Я полагаю, что одна из них более чувствительна к сборщику мусора, или, возможно, импорт обеих библиотек как-то запускает сборщик мусора раньше.В любом случае, даже со стандартными виджетами у вас могут возникнуть проблемы, потому что v всегда будет собирать мусор.

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