【问题标题】:AttributeError: 'Checkbutton' object has no attribute 'deselect'AttributeError:“Checkbutton”对象没有“取消选择”属性
【发布时间】:2020-01-24 16:42:17
【问题描述】:

我在从包含“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 行,在 创建复选框() 文件“C:/Users/jmamuham/PycharmProjects/LogBook/load_state.py”,第 20 行,在 createCheckboxes 中 检查.取消选择() AttributeError: 'Checkbutton' 对象没有属性 'deselect'

知道为什么 .select() 和 .deselect() 会给我这个错误吗?

顺便问一下,我是否使用正确的方法来使用 1 和 0 重新填充复选框状态?

【问题讨论】:

  • f.close() after return 将永远不会被执行。
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
  • ttk.Checkbutton 没有select()deselect()。但是tkinter.Checkbutton()select()deselect()
  • @furas 注意,我已经编辑了完整的错误消息。感谢 ttk.Checkbutton() 和 tk.checkbutton() 的输入。显然错误来自于此。
  • "variable=x":这不起作用,请阅读Checkbutton option variable=

标签: python tkinter tkinter.checkbutton


【解决方案1】:

还有比 select() 和 deselect() 更简单的方法!如果您将检查按钮正确链接到 tkinter int 或布尔变量,则检查按钮将自动检查和取消检查是否分别给出 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()

【讨论】:

  • f.close() after return 将永远不会被执行。
  • 感谢@schwartz721。顺便说一句,当ttk.Checkbutton 已经有了variable = x 时,为什么我们还需要check.var = x
  • @zwair 它与 python 的自动垃圾收集有关。如果 python 认为某个变量没有被使用,它会清除该内存空间并忘记该变量。虽然对我们来说很明显该变量仍在使用中(因为它链接到 Checkbutton),但对 python 来说并不明显。将变量保存为 python 知道要保留的对象的属性使变量值得保留。这是我上周就这个确切主题提出的问题的链接:stackoverflow.com/questions/59797094/…
【解决方案2】:
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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2018-10-04
    • 2017-07-22
    相关资源
    最近更新 更多