Запутанность между контрольными кнопками Tkinter

Привет, я делаю программу, в которой есть кнопка-флажок в главном окне и окно верхнего уровня, в котором она тоже есть. проблема в том, что по какой-то причине контрольная кнопка верхнего уровня влияет на состояние основной контрольной кнопки, или основная контрольная кнопка имитирует кнопку верхнего уровня (если вы устанавливаете / снимаете флажок с верхнего уровня, главная кнопка также проверяет / снимает флажок). Вот пример кода, который отображает проблему:

import tkinter as tk

def toplevel():
    top = tk.Toplevel()
    top.geometry('200x50')

    top_chekbutton = tk.Checkbutton(top, text='top')

    top_chekbutton.pack()

    top.mainloop()

main = tk.Tk()
main.geometry('200x50')

open_top = tk.Button(main, text='open top', command=toplevel)

main_checkbutton = tk.Checkbutton(main, text='main')

main_checkbutton.pack()
open_top.pack()

main.mainloop()

я не определял переменные состояния, потому что они не кажутся источником проблемы. я использую python 3.7.7 и tkinter 8.6 на win10. помогите плиз :(


person savyexe    schedule 26.05.2020    source источник
comment
Просто привяжите variable к этим checkbutton виджетам.   -  person jizhihaoSAMA    schedule 26.05.2020
comment
Отвечает ли это на ваш вопрос? почему-эти-python-tkinter-checkbuttons-связаны   -  person stovfl    schedule 26.05.2020
comment
Прочтите виджет Tkinter Checkbutton   -  person stovfl    schedule 26.05.2020


Ответы (1)


Как правило, каждый экземпляр Checkbutton должен иметь связанную с ним переменную. Если этого не сделать, будет использоваться значение по умолчанию, одинаковое для всех Checkbuttons. Все виджеты, использующие одну и ту же переменную, будут отображать одно и то же значение.

Вы можете убедиться в этом сами, распечатав значения top_chekbutton.cget("variable") и main_checkbutton.cget("variable"). В обоих случаях значение равно «!checkbutton» (по крайней мере, в той версии Python, которую я использую).

Итак, назначьте переменную для ваших флажков, например, BooleanVar, IntVar или StringVar.

main_var = tk.BooleanVar(value=False)
main_checkbutton = tk.Checkbutton(main, text='main')
person Bryan Oakley    schedule 26.05.2020
comment
Хорошо, это имеет большой смысл, но в моей реальной программе у них разные переменные, и они все равно делают одно и то же: C - person savyexe; 27.05.2020
comment
@savyexe: я могу ответить только на код, который вы разместили. Если чекбоксы «перепутаны», единственное объяснение состоит в том, что у них одна и та же переменная. Если ваши переменные локальны, это может быть побочным эффектом. - person Bryan Oakley; 27.05.2020
comment
хорошо, это работало просто отлично, за исключением того, что фактическое значение переменной не изменилось, поэтому я добавил командную функцию к контрольной кнопке, чтобы изменить значение переменной всякий раз, когда она нажата, и теперь это работает, спасибо за совет: D - person savyexe; 27.05.2020
comment
@savyexe: вам не нужно этого делать. Кнопка-флажок автоматически установит значение связанной переменной. Если этого не происходит, вы делаете что-то не так. - person Bryan Oakley; 27.05.2020