#python #tkinter
Вопрос:
У меня очень странная проблема.
Я пишу код для кнопки проверки (tkinter).
- если код в одном файле, он может работать. Кнопка «проверить» может отображать текущее состояние (изменение значения).
Отладка — в процессе проверки
Значение C1 равно : 1
Значение C2 равно : 0
Отладка — в процессе проверки Значение C1 равно : 1
Значение C2 равно : 1
2 если код в одном определении, значение всегда равно 0 (не изменяется)
Как я могу исправить эту проблему?
Спасибо
Один файл:
#!/usr/bin/python3
from tkinter import *
root = Tk()
CheckVar1 = IntVar()
CheckVar2 = IntVar()
Name1 = "Music"
Name2 = "Video"
C1 = Checkbutton(root, text = Name1, variable = CheckVar1, onvalue = 1, offvalue = 0 )
C2 = Checkbutton(root, text = Name2, variable = CheckVar2,onvalue = 1, offvalue = 0 )
C1.pack()
C2.pack()
def check_value():
print("Debug -- in check proc")
print("The value of C1 is :", CheckVar1.get())
print("The value of C2 is :", CheckVar2.get())
Button(root, text = 'check', command = check_value).pack()
mainloop()
Файл с def
#!/usr/bin/python3
from tkinter import *
def tree_ts_summary():
root = Tk()
CheckVar1 = IntVar()
CheckVar2 = IntVar()
Name1 = "Music"
Name2 = "Video"
C1 = Checkbutton(root, text = Name1, variable = CheckVar1, onvalue = 1, offvalue = 0 )
C2 = Checkbutton(root, text = Name2, variable = CheckVar2,onvalue = 1, offvalue = 0 )
C1.pack()
C2.pack()
def check_value():
print("Debug -- in check proc")
print("The value of C1 is :", CheckVar1.get())
print("The value of C2 is :", CheckVar2.get())
Button(root, text = 'check', command = check_value).pack()
mainloop()
root_top = Tk()
Button(root_top, text = 'call_def', command = tree_ts_summary).pack()
mainloop()
Комментарии:
1. Не могли бы вы привести минимальный пример проблемы?
2. ну, я думаю, что проблема связана с Python в документе GC (сборщик мусора), которые могут удалить несколько ссылок на некоторые объекты, в принципе не используют функцию, как этот, лучше в таких случаях использовать
class
или не использовать вложенные функции внутри других функций, оставить их и передать необходимые вещи в качестве аргументов при вызове их3. Это может быть связано с несколькими случаями
Tk()
. Если вы уже создали экземплярTk()
outsidetree_ts_summary()
, то используйтеToplevel()
вместоTk()
insidetree_ts_summary()
. Такжеroot.mainloop()
не требуется внутри функции.4. Большое спасибо. Я обновил код.
5. Причина проблемы с вашим обновленным кодом связана с несколькими случаями
Tk()
, как я сказал в своем последнем комментарии.
Ответ №1:
Как упоминал @acw1668 в комментариях, у вас не должно быть нескольких экземпляров Tk(). Вы можете изменить свой код следующим образом:
from tkinter import *
def tree_ts_summary():
CheckVar1 = IntVar()
CheckVar2 = IntVar()
Name1 = "Music"
Name2 = "Video"
C1 = Checkbutton(root, text = Name1, variable = CheckVar1, onvalue = 1, offvalue = 0 )
C2 = Checkbutton(root, text = Name2, variable = CheckVar2,onvalue = 1, offvalue = 0 )
C1.pack()
C2.pack()
def check_value():
print("Debug -- in check proc")
print("The value of C1 is :", CheckVar1.get())
print("The value of C2 is :", CheckVar2.get())
Button(root, text = 'check', command = check_value).pack()
root = Tk()
Button(root, text = 'call_def', command = tree_ts_summary).pack()
root.mainloop()