Как получить 'state' из Tkinter Checkbutton? Под 'state' я подразумеваю получить, есть ли в нем галочка или нет.
Получение состояния Checkbutton
Ответы (3)
60
Когда вы создаете его, он принимает аргумент ключевого слова 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
36
Если вы используете модуль 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
-2
ответ 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)
