【问题标题】:Getting Tkinter Checkbutton value from grid position从网格位置获取 Tkinter Checkbutton 值
【发布时间】:2021-01-30 21:57:57
【问题描述】:

我无法从网格位置获取 tkinter 复选框按钮的开/关状态。在这个基本示例中,如果复选框已打开,我想打印文本,但我不断收到 checkbutton 对象没有属性 get 的错误,尽管当我单击其中一个复选框时,测试函数会打印“on”或“关”就好了。

import tkinter as tk

def gui(root):
    root.geometry('150x150')
    root.config(background='snow3')

    for row in range(5):
        checkboxVar = tk.IntVar()
        checkbox = tk.Checkbutton(root, text='', variable=checkboxVar, command= lambda status=checkboxVar: test(status=status))
        checkbox.select()
        checkbox.grid(row=row, column=1)
        textbox = tk.Text(root, height=1, width=10)
        textbox.grid(row=row, column=2)
    saveBtn = tk.Button(root, text='Save', command=save)
    saveBtn.grid(row=6, column=1)


def save():
    for row in range(5):
        print(root.grid_slaves(row=row, column=2)[0].get('1.0', 'end-1c'))
        if root.grid_slaves(row=row, column=1)[0].get() == 1:
            print(root.grid_slaves(row=row, column=2)[0].get('1.0', 'end-1c'))


def test(status):
    if status.get() == 0:
        print('OFF')
    if status.get() == 1:
        print('ON')

if __name__ == '__main__':
    root = tk.Tk()
    gui(root)
    tk.mainloop()
AttributeError: 'Checkbutton' object has no attribute 'get'

【问题讨论】:

  • 这里的错误意味着它所说的,要获得一个checkbutton的值,你必须使用get()和它的variable。

标签: python python-3.x tkinter tk


【解决方案1】:

即使错误是正确的,您的代码也能正常运行,Checkbutton 没有任何 get() 属性。我认为您正在尝试获取 checkboxVar 的值。但是由于函数之间没有联系,我认为不可能在您的代码中获取Variable 的实例。

因此,要解决此问题,您可以将所有 checkboxVar 值保存到列表或字典中以供以后使用,或者将它们保存到各自的 Checkbuttons。

...
    for row in range(5):
        checkboxVar = tk.IntVar()
        checkbox = tk.Checkbutton(root, text='', variable=checkboxVar, command=lambda status=checkboxVar: test(status=status))
        checkbox.select()
        checkbox.var = checkboxVar  # SAVE VARIABLE
        checkbox.grid(row=row, column=1)
        textbox = tk.Text(root, height=1, width=10)
        textbox.grid(row=row, column=2)
    saveBtn = tk.Button(root, text='Save', command=save)
    saveBtn.grid(row=6, column=1)
...

稍后可以从检查按钮的实例中调用,例如checkbutton.var.get()。所以这里是你的save() 函数的一个小改动

def save():
    for row in range(5):
        print(root.grid_slaves(row=row, column=2)[0].get('1.0', 'end-1c'))
        if root.grid_slaves(row=row, column=1)[0].var.get():
            print(root.grid_slaves(row=row, column=2)[0].get('1.0', 'end-1c'))

【讨论】:

  • 非常感谢!这解决了我的问题。你怎么知道(或者我以后会知道)将 checkboxVar 保存到 checkbox.var,然后再引用它?为什么调用网格位置时需要它,而不是在测试函数中?谢谢!!!
  • 好吧test(status) 有一个不同的故事,您将变量作为参数传递给函数,而在您的保存函数中,您引用的是复选按钮。无论哪种方式都可以完成,就像您也可以将checkboxVar 作为参数传递给保存函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多