tkinter,кнопка проверки, один и тот же код имеет другой результат в def или одном файле

#python #tkinter

Вопрос:

У меня очень странная проблема.

Я пишу код для кнопки проверки (tkinter).

  1. если код в одном файле, он может работать. Кнопка «проверить» может отображать текущее состояние (изменение значения).

Отладка — в процессе проверки

Значение 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() outside tree_ts_summary() , то используйте Toplevel() вместо Tk() inside tree_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()