Python - tkinter 小部件数组随着单选按钮的点击而变化

标签 python arrays user-interface tkinter radio-button

我正在使用 tkinter 在 Python 中开发 GUI。我正在读取一个文本文件并根据文本文件中的行动态创建 GUI 元素。我的每种元素类型都有一个数组,其中包括标签、单选按钮变量 (StringVars) 和彩色圆圈(使用 create_oval 绘制)。我的目标是,当用户将单选按钮从“未分配”更改为“输入”或“输出”时,该行上的彩色圆圈将从黄色变为绿色。以下是读入文本文件后 GUI 的显示方式:

Item 1: (o) in () out () 未分配 (G)

项目 2:() in () out (o) 未分配 (Y)

目前,我在单选按钮 StringVars 上有一个跟踪,这样我就可以在其中一个按钮发生变化时调用一个方法。我的问题是找出更改了哪个单选按钮,以便我可以更改该行上圆圈的颜色...

我目前正在将整个单选按钮 StringVar 数组复制到一个临时全局数组中。当跟踪函数被调用时,我将临时数组与数组中当前的内容进行比较,以确定变化在哪里。我复制数组:temp_radiobutton_vars = list(radiobutton_vars),但我不确定这是否是正确的路线。当我 get() StringVar 时,我的临时列表和当前列表始终显示相同的结果,即使在我更改按钮之后也是如此。关于如何解决这个问题的任何想法,或者可能有更好的方法来做我想做的事情...

抱歉,解释冗长且不够好。如果有人需要更多信息或代码片段,请告诉我。谢谢!

最佳答案

有很多方法可以解决这个问题。由于您已经在使用变量跟踪,也许最简单的解决方案是将 Canvas 项的索引传递给回调。您可以使用 lambdafunctools.partial 来完成这项任务。您也可以不使用变量跟踪,而是将命令与每个单选按钮相关联。在这两种情况下,您只需告诉回调要对哪个索引进行操作。

在以下示例中,回调采用对变量的引用和对 Canvas 项的索引。它获取值,在表中查找颜色,然后配置 Canvas 项目:

def on_radiobutton(var, index):
    value = var.get()
    color = {"in": "green", "out": "red", "unassigned": "yellow"}
    self.canvas.itemconfigure(index, fill=color[value])

这是使用 lambda 设置跟踪的方式(注意 name1name2op 由 tkinter 自动发送给每个跟踪):

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))

关于Python - tkinter 小部件数组随着单选按钮的点击而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31477710/

相关文章:

Python 等效于 Matlab 文本扫描

python - PIP/Python 软件包安装到错误的 PATH

arrays - 有没有办法从 NSManagedObject 数组中获取特定属性的字符串数组

arrays - Swift "-"CollectionTypes 上的二元运算符

C# 在窗体中执行方法

python - 使用 ECC 生成至少为 d 汉明距离的二进制字符串

python - 在 python 中没有 for 循环的情况下重复函数几次

java - 我的程序出现错误

python - GtkOverlay 隐藏 GtkTextView

user-interface - 企业产品的功能区 UI 用户指南或示例