【问题标题】:Tkinter, Trying to generate Checkbutton in loopTkinter,试图在循环中生成 Checkbutton
【发布时间】:2014-03-03 15:36:35
【问题描述】:

我正在尝试在循环中生成独立的 Checkbutton,但具有相同名称的 Checkbutton 可以一起工作。我不知道我的错误在哪里......

#!/usr/bin/env python
#-*-coding:utf-8-*-
import os
from Tkinter import * 
import ttk 

def checkBoxText(st):
    if st == 0:
        st="Disabled"
    if st == 1:
        st="Enabled"
    return st

root = Tk()

winSt={1:1,2:1,3:0,4:0}
cbTexts={}
cbVariables={}
cb={}
cb_x={ "1":"0.0", "2":"0.0", "3":"0.6", "4":"0.6" }
cb_y={"1": "0.1", "2": "0.8", "3": "0.1", "4": "0.8"}
for i in sorted(winSt.keys()):
    cbTexts[i] = StringVar()
    cbTexts[i].set(checkBoxText(winSt[i]))
    cbVariables[i] = IntVar()
    cbVariables[i].set(winSt[i])

    cb[i] = Checkbutton(root, text=cbTexts[i].get(), variable=cbVariables[i].get())
    cb[i].place(relx=cb_x[str(i)], rely=cb_y[str(i)], relheight=0.1,relwidth=0.4)
mainloop()

【问题讨论】:

  • 我也不知道你的错误在哪里。如果您解释了预期输出与实际输出以及您可能遇到的任何错误,将会有所帮助。
  • 对不起,我更正了标题和问题,因为我确实写了组合框而不是复选按钮。所以我觉得我看到了错误,当我在循环中创建检查按钮并设置“变量”配置并且谁具有相同的变量值时,它们就像一个检查按钮一样工作。也许我必须在循环后检查检查按钮,但如何? cb["1"].configure(variable=1) 这不起作用。
  • variable=cbVariables[i].get() 更改为variable=cbVariables[i]
  • 天哪。非常感谢@Joel Cornett。直到现在,它让我发疯了。它有效:)

标签: python variables loops button tkinter


【解决方案1】:

问题出在这一行:

cb[i] = Checkbutton(..., variable=cbVariables[i].get())

当你使用variable 属性时,你必须给它一个变量对象的引用,而不是对象中包含的值。把代码改成这样:

cb[i] = Checkbutton(..., variable=cbVariables[i])

您在检查按钮文本上犯了一个类似的错误。您正在创建一个 StringVar,但随后将 StringVar 的值用于检查按钮文本而不是实际变量。从语法上讲,当与 text 属性一起使用时这是正确的,但它所做的工作比它需要的要多。您应该使用textvariable 属性,或者干脆not 创建一个StringVar。

下面是如何使用textvariable 属性而不是text 属性:

cb[i] = Checkbutton(root, textvariable=cbTexts[i], ...)

如果此文本永远不会更改,则您根本不需要 StringVar。如果是这种情况,您可以这样做并保存几行代码:

cb[i] = Checkbutton(root, text=checkBoxText(winSt[i]), ...)

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多