Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: rectangletangleОтветов: 3

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

pythontkinter

Ответы

Ответ 1 · рейтинг 60 · aaronasterling

Когда вы создаете его, он принимает аргумент ключевого слова 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

Ответ 2 · рейтинг 36 · bitsmack

Если вы используете модуль 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). В этом вопросе рассказывается о различиях между старыми стандартными виджетами и новыми, "тематическими".

Ответ 3 · рейтинг -2 · Jim Robinson

ответ 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы