AttributeError: объект «Checkbutton» не имеет атрибута «отменить выбор»

У меня возникла проблема с загрузкой состояния флажка из текстового файла, содержащего «0» и «1».

inside "test.txt" file :

1
0
1
0

Это то, что я ожидаю, что результат будет таким: «1» представляет собой флажок, а «0» представляет собой флажок без флажка.

введите здесь описание изображения

Ниже приведен код, над которым я работаю:

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry("180x90")
name1 = ["Mike", "Harry", "Siti", "Jenn"]

def loadstates():
    f = open("test.txt", "r")
    list_a = []
    list_a = f.readlines()
    return list_a
    f.close()

def createCheckboxes():
    for x, y in zip(st, name1):
        check = ttk.Checkbutton(root, text=y, variable=x)
        if x=='0':
            check.select()
        else:
            check.deselect()
        check.pack(anchor=tk.W)

st = loadstates()
createCheckboxes()
root.mainloop()

Но выдает ошибку:

Traceback (последний последний вызов): файл "C:/Users/jmamuham/PycharmProjects/LogBook/load_state.py", строка 24, в createCheckboxes(). Файл "C:/Users/jmamuham/PycharmProjects/LogBook/load_state. .py", строка 20, в createCheckboxes check.deselect() AttributeError: объект "Checkbutton" не имеет атрибута "deselect"

Любая идея, почему .select() и .deselect() дают мне эту ошибку?

Кстати, я использую правильный подход к повторному заполнению состояния флажка, используя 1 и 0?


person zwair    schedule 24.01.2020    source источник
comment
f.close() после return никогда не будет выполняться.   -  person furas    schedule 24.01.2020
comment
всегда помещайте полное сообщение об ошибке (начинающееся со слова Traceback) в вопрос (не комментарий) в виде текста (не снимка экрана). Есть и другая полезная информация.   -  person furas    schedule 24.01.2020
comment
ttk.Checkbutton не имеет select() и deselect(). Но у tkinter.Checkbutton() есть select() и deselect().   -  person furas    schedule 24.01.2020
comment
@furas Отмечено, я отредактировал полное сообщение об ошибке. Спасибо за вклад в ttk.Checkbutton() и tk.checkbutton(). Видимо ошибка из-за этого.   -  person zwair    schedule 24.01.2020
comment
variable=x: это не сработает, прочитайте Флажок variable=   -  person stovfl    schedule 24.01.2020


Ответы (2)


Есть еще более простой способ, чем select() и deselect()! Если вы правильно свяжете контрольную кнопку с целочисленной или логической переменной tkinter, контрольная кнопка автоматически проверит и снимет отметку, если ей заданы значения 1/True или 0/False соответственно. Вот как:

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry("180x90")
name1 = ["Mike", "Harry", "Siti", "Jenn"]

def loadstates():
    f = open("test.txt", "r")
    list_a = []
    list_a = f.readlines()
    f.close()
    return [int(i) for i in list_a] # Make sure your values are integers, not strings

def createCheckboxes():
    for value, y in zip(st, name1):
        x = tk.IntVar() # This is a tkinter variable. BooleanVar() will also work here
        x.set(value) # When modifying values of a tkinter variable, always use .set()
        check = ttk.Checkbutton(root, text=y, variable=x)
        check.var = x # Link the variable to the checkbutton so it isn't thrown out by garbage collection
        check.pack(anchor=tk.W)

st = loadstates()
createCheckboxes()
root.mainloop()
person schwartz721    schedule 24.01.2020
comment
f.close() после return никогда не будет выполняться. - person furas; 24.01.2020
comment
спасибо @schwartz721. Кстати, зачем нам check.var = x, когда у ttk.Checkbutton уже есть variable = x? - person zwair; 26.01.2020
comment
@zwair это связано с автоматической сборкой мусора python. Если python считает, что переменная не используется, он сотрет это пространство памяти и забудет о переменной. Хотя для нас очевидно, что переменная все еще используется (поскольку она связана с Checkbutton), для python это неочевидно. Сохранение переменной как атрибута объекта, который python знает, чтобы сохранить, делает эту переменную полезной. Вот ссылка на вопрос, который я задавал именно по этой теме на прошлой неделе: stackoverflow.com/questions/59797094/ - person schwartz721; 26.01.2020

import tkinter as tk
root = tk.Tk()
root.geometry("180x90")
name1 = ["Mike", "Harry", "Siti", "Jenn"]

def loadstates():
    f = open("test.txt", "r")
    list_a = []
    list_a = f.readlines()
    f.close()
    return list_a

def createCheckboxes():
    for x, y in zip(st, name1):
        check = tk.Checkbutton(root, text=y, variable=x)
        if x.strip()=='0':
            check.select()
        else:
            check.deselect()
        check.pack(anchor=tk.W)

st = loadstates()
createCheckboxes()
root.mainloop()

Используйте tk.Checkbutton

Используйте x.strip()=='0'

person ganit44    schedule 24.01.2020