我正在使用tkinter在Python中使用GUI。我正在读取文本文件并根据文本文件中的行动态创建GUI元素。我为每个元素类型都有一个数组,包括标签,单选按钮变量(StringVars)和彩色圆圈(用create_oval绘制)。我的目标是当用户将单选按钮从“未分配”更改为“进入”或“向外”时,该行上的彩色圆圈将从黄色变为绿色。以下是GUI读取文本文件后的外观:
第1项:(o)in()out()未分配(G)
第2项:()in()out(o)未分配(Y)
目前,我对radiobutton StringVars有一个跟踪,这样我可以在其中一个按钮被更改时调用方法。我的问题是弄清楚哪个单选按钮被改变了,这样我就可以改变那条线上的圆圈的颜色...
我目前正在将整个radiobutton StringVar数组复制到临时全局数组中。调用跟踪函数时,我将临时数组与数组中当前的数组进行比较,以确定更改的位置。我复制了数组:temp_radiobutton_vars = list(radiobutton_vars),但我不确定这是否是正确的路线。当我得到()StringVar时,我的临时列表和当前列表总是显示相同的结果,即使我更改了按钮。关于如何解决这个问题的任何想法,或者可能有更好的方法来做我想做的事......
很抱歉这个漫长而不是很好的解释。如果有人需要更多信息或代码片段,请告诉我们。谢谢!
答案 0 :(得分:3)
有很多方法可以解决这个问题。由于您已经在使用变量跟踪,因此最简单的解决方案可能是将canvas项的索引传递给回调。您可以使用lambda
或functools.partial
执行此任务。您也可以不使用变量跟踪,而是将命令与每个单选按钮相关联。在这两种情况下,您只需要告诉回调操作哪个索引。
在以下示例中,回调接受对变量的引用和对canvas项的索引。它获取值,在表中查找颜色,然后配置画布项:
def on_radiobutton(var, index):
value = var.get()
color = {"in": "green", "out": "red", "unassigned": "yellow"}
self.canvas.itemconfigure(index, fill=color[value])
这是使用lambda设置跟踪的方法(请注意,tkinter会为每个跟踪自动发送name1
,name2
和op
:
var = tk.StringVar()
rb0 = tk.Radiobutton(..., variable=var, value="in", text="in")
rb1 = tk.Radiobutton(..., variable=var, value="out", text="out")
rb2 = tk.Radiobutton(..., variable=var, value="unassigned", text="not assigned")
var.trace("w", lambda name1, name2, op, index=i, var=var:
on_radiobutton(var, index))
答案 1 :(得分:2)
听起来你对Radiobuttons
有错误的想法。所有“已连接”Radiobuttons
应具有相同的variable
值;通过这种方式,您可以致电theVariable.get()
并将其与每个value
的{{1}}进行比较;你不应该需要每个Radiobutton
的引用;你也不应该为每个Radiobutton
StringVar
,只有每一行。
编辑:我已经扩展了我的示例,以展示这对于多行是如何工作的。所有改变的是现在我检查我在回调中传递了哪一行,并使用它我知道要更新哪一行(在你的情况下,哪个画布颜色)。这只是一些2D列表处理,用于根据发出回调的行来检查选择了哪个Radiobutton
。
Radiobutton