首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter: checkbox不会在for循环中更新

tkinter: checkbox不会在for循环中更新
EN

Stack Overflow用户
提问于 2021-10-11 12:56:32
回答 1查看 44关注 0票数 0

我被以下问题卡住了。使用for循环,我想创建几个复选框,以自动更新标签,声明复选框是否已勾选。然而,它给出了错误的结果(它总是说复选框是勾选的,不管是不是这样;值得注意的是,复选框在默认情况下是取消勾选的),即see here how the GUI looks like (including error)。与复选框相对应的IntVars工作正常,当勾选至少一个复选框并按下其功能是读取复选框的按钮时可以看到。另请参阅以下代码:

代码语言:javascript
运行
复制
import tkinter as tk

top = tk.Tk()
n_passes = 3

checkbox_var = [0] * n_passes
checkbox = [0] * n_passes

def tick_passes(i): # update label saying if checkboxes are ticked
    if checkbox_var[i].get == 0:
        label = tk.Label(top, text = f"pass #{i} not ticked")
    else:
        label = tk.Label(top, text = f"pass #{i} ticked")
    label.grid(row = 1, column = i)

def check_checkbox_var(): # check whether checkbox_var[i] is updated
    for i in range(n_passes):
        print(f"checkbox_var[i].get() = {checkbox_var[i].get()}")

for i in range(n_passes):
    checkbox_var[i] = tk.IntVar() # turn on/off certain passes
    print(f"checkbox_var[i].get() = {checkbox_var[i].get()}")
    checkbox[i] = tk.Checkbutton(top, text = f"Tick pass {i}", variable =
    checkbox_var[i], command = tick_passes(i))
    checkbox[i].grid(row = 0, column = i, sticky=tk.W)

    var_button = tk.Button(top, text = "Check checkbox_var", command =
    check_checkbox_var).grid(row = 2, column = 0) # check whether checkbox_var[i] is updated

top.mainloop()

有人能帮我更新标签吗?如果有另一种方法来解决这个问题,例如,按下按钮而不是勾选复选按钮,这也适用于我。

EN

回答 1

Stack Overflow用户

发布于 2021-10-11 13:18:23

i始终为2,因为在启动主循环后,实际上没有运行任何循环。下面的方法是可行的,但是您需要对标签进行一些更改,因为现在所有的标签都是一个接一个地添加。您应该创建它们一次,然后只更新文本,但我将把这一部分留给您。

代码语言:javascript
运行
复制
import tkinter as tk

top = tk.Tk()
n_passes = 3

checkbox_var = [0] * n_passes
checkbox = [0] * n_passes

def tick_passes(): # update label saying if checkboxes are ticked
    for i in range(n_passes):
        if checkbox_var[i].get() == 0:
            label = tk.Label(top, text = f"pass #{i} not ticked")
        else:
            label = tk.Label(top, text = f"pass #{i} ticked")
        label.grid(row = 1, column = i)

def check_checkbox_var(): # check whether checkbox_var[i] is updated
    for i in range(n_passes):
        print(f"checkbox_var[i].get() = {checkbox_var[i].get()}")

for i in range(n_passes):
    print(i)
    checkbox_var[i] = tk.IntVar() # turn on/off certain passes
    print(f"checkbox_var[i].get() = {checkbox_var[i].get()}")
    checkbox[i] = tk.Checkbutton(top, text = f"Tick pass {i}", variable =
    checkbox_var[i], command = tick_passes)
    checkbox[i].grid(row = 0, column = i, sticky=tk.W)

    var_button = tk.Button(top, text = "Check checkbox_var", command =
    check_checkbox_var).grid(row = 2, column = 0) # check whether checkbox_var[i] is updated

top.mainloop()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69526585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档