Получение состояния Checkbutton

Как получить 'state' из Tkinter Checkbutton? Под 'state' я подразумеваю получить, есть ли в нем галочка или нет.


person rectangletangle    schedule 21.11.2010    source источник


Ответы (3)


Когда вы создаете его, он принимает аргумент ключевого слова variable. Передайте IntVar от Tkinter. Установка или снятие флажка установит значение, содержащееся в var, в соответствующее логическое состояние. Доступ к этому можно получить как var.get():

проверено => var.get()

не отмечено => not var.get()

>>> root = Tkinter.Tk()
>>> var = Tkinter.IntVar()
>>> chk = Tkinter.Checkbutton(root, text='foo', variable=var)
>>> chk.pack(side=Tkinter.LEFT)
>>> var.get()  #unchecked
0
>>> var.get()  #checked
1
person aaronasterling    schedule 21.11.2010
comment
Без переменной нельзя? знак равно - person Ciro Santilli 新疆再教育营六四事件ۍ 15.01.2014
comment
если для вас важно, чтобы вы могли получить значение через виджет, вы всегда можете прикрепить переменную к виджету (что-то вроде chk.val = var), а затем получить к ней доступ с помощью chk.val.get() - person Ronen Ness; 06.12.2014
comment
@CiroSantilli烏坎事件2016六四事件法轮功 Прошло много лет, но я ответил на ваш давний комментарий. - person bitsmack; 11.12.2016
comment
Использование переменных на самом деле довольно мощно. Вы можете использовать переменную не только для проверки состояния флажка, но также можете использовать переменную для установки значения флажка. Таким образом, var.set(1) гарантирует, что галочка отображается, а var.set(0) гарантирует, что галочка снята. Кроме того, вы можете установить функцию трассировки для переменной, чтобы, если кто-то нажмет на флажок, эта функция могла быть активирована. Все это часть событийно-ориентированной парадигмы. Очень мощная штука. - person Gary02127; 07.11.2017

Если вы используете модуль new* ttk от tkinter, вы можете читать и записывать состояния контрольной кнопки без назначения переменных.

import tkinter
from tkinter import ttk
tkwindow = tkinter.Tk()
chk = ttk.Checkbutton(tkwindow, text="foo")
chk.grid(column=0, row=0)

Обратите внимание, что новый флажок по умолчанию имеет «альтернативное», иногда называемое «полуотмеченным», состояние:

альтернативный

Вы можете прочитать текущее состояние, используя метод .state():

>>> print(chk.state())  # half-checked
('alternate',)
>>> print(chk.state())  # checked
('selected',)
>>> print(chk.state())  # not checked
()

Чтобы установить состояние в коде:

chk.state(['selected'])  # check the checkbox
chk.state(['!selected']) # clear the checkbox
chk.state(['disabled'])  # disable the checkbox
chk.state(['!disabled','selected']) # enable the checkbox and put a check in it!

А вот удобный способ проверить конкретное состояние:

chk.instate(['selected'])  # returns True if the box is checked

Есть две хитрые вещи, которые я нашел:

  1. Начальное состояние «альтернативное», и этот флаг состояния не очищается при добавлении флага «выбранного» состояния. Итак, если вы хотите переключить свою кнопку-флажок в коде, вам сначала нужно очистить флаг «альтернативный»:

    chk.state(['!alternate'])
    
  2. Если вы отключите/включите контрольную кнопку, используя

    chk.state(['disabled'])
    chk.state(['!disabled'])
    

    тогда все работает нормально. Но, если вы используете эти общие, альтернативные методы:

    chk.config(state=tk.DISABLED)
    chk.config(state=tk.NORMAL)
    

    затем он подтверждает «альтернативный» флаг.

    Такого поведения не происходит, если вы назначаете переменную контрольной кнопке, но тогда, если вы хотите назначить переменную, этот ответ, вероятно, вам не поможет :)


* ttk стал доступен в Python 2.7 (Tk 8.5). В этом вопросе рассказывается о различиях между старыми стандартными виджетами и новыми, "тематическими".

person bitsmack    schedule 11.12.2016
comment
AttributeError: объект «Checkbutton» не имеет атрибута «instate» :( - person Foggy Minded Greenhorn; 17.05.2020
comment
@AbdullahSaid Хм, у меня это все еще работает. Возможно, вы используете старую кнопку tkinter Checkbutton вместо ttk.Checkbutton? - person bitsmack; 17.05.2020

ответ bitsmack не совсем согласуется с тем, что я вижу.

chk.state() возвращает кортеж, который при выборе имеет два элемента: ('focus','selected')

import tkinter as tk
from tkinter import ttk
def p(event):
    st = ck.state()
    print (f'is tuple {type(st) is tuple}  {len(st)}-----------------------------------------')
    if 'selected' in st:
        print ('got selected')
    for i,pst in enumerate(st) :
        print(f'{i}, {pst}')

    
root = tk.Tk()
root.geometry('200x200+300+200')
root.grid_rowconfigure(0, weight = 1)

ck = ttk.Checkbutton(root,text = 'tryme')
ck.grid()
root.bind('<Return>',p)
root.mainloop()

дает этот результат:

кортеж True 1--------------------------------------------------------------------

0, альтернатива — это кортеж True 2--------------------------------------------------------

got selected 0, focus 1, selected is tuple True 1----------------------------------------------------- ---

0, фокус

Итак, чтобы определить, установлен ли флажок:

if 'selected' in chk.state()

для альтернативы:

if 'alternate' in chk.state()

для не выбранных:

if not ('selected' in chk.state or 'alternate' in chk.state)
person Jim Robinson    schedule 22.01.2021
comment
Я знаю, что не должен ссылаться на предыдущий ответ, но сейчас я не могу добавлять комментарии. - person Jim Robinson; 23.01.2021
comment
Привет Джим. Добро пожаловать в Stack Overflow и спасибо за участие. Я отклонил этот ответ, потому что он читается как ответ на существующий ответ, и популярное решение уже принято по этому 10-летнему вопросу. Пожалуйста, рассмотрите возможность удаления этого ответа и вместо этого оставьте комментарий к ответу @bitsmack. - person Captain Hat; 23.01.2021
comment
Спасибо за ваш комментарий. Я бы прокомментировал ответ, но мне не хватает репутации, чтобы комментировать. Я чувствовал, что проблемы, с которыми я столкнулся после ответа, были достаточно значительными, чтобы нуждаться в разъяснении. - person Jim Robinson; 23.01.2021