Как получить 'state'
из Tkinter Checkbutton
? Под 'state'
я подразумеваю получить, есть ли в нем галочка или нет.
Получение состояния Checkbutton
Ответы (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
Если вы используете модуль 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
Есть две хитрые вещи, которые я нашел:
Начальное состояние «альтернативное», и этот флаг состояния не очищается при добавлении флага «выбранного» состояния. Итак, если вы хотите переключить свою кнопку-флажок в коде, вам сначала нужно очистить флаг «альтернативный»:
chk.state(['!alternate'])
Если вы отключите/включите контрольную кнопку, используя
chk.state(['disabled']) chk.state(['!disabled'])
тогда все работает нормально. Но, если вы используете эти общие, альтернативные методы:
chk.config(state=tk.DISABLED) chk.config(state=tk.NORMAL)
затем он подтверждает «альтернативный» флаг.
Такого поведения не происходит, если вы назначаете переменную контрольной кнопке, но тогда, если вы хотите назначить переменную, этот ответ, вероятно, вам не поможет :)
* ttk стал доступен в Python 2.7 (Tk 8.5). В этом вопросе рассказывается о различиях между старыми стандартными виджетами и новыми, "тематическими".
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)