Tkinter单选按钮清除/重置值

时间:2013-04-29 17:12:35

标签: radio-button tkinter

我是第一次写Tkinter程序,并对单选按钮有疑问。我想要做的是:

  1. 打开一组图像(一次一个)。
  2. 打开图像时,使用单选按钮注释值。
  3. 在列表中收集此值
  4. 因此,在这个例子中,我有2个化合物,列表中有2个注释。

    我遇到的问题是,如果错误地用户点击radiobutton 2而不是一个,然后更正他/她自己,列表将有4个项目(第一个图像为3个,第二个图像为1个)。我如何处理这个,以便列表只有2个值?

    import Tkinter as tk
    from PIL import ImageTk, Image
    from tkFileDialog import askopenfilename
    
    cmp_list = ["VU435DR","VU684DR"]
    
    li = []
    li_final = []
    
    def sel():
        selection = str(var.get())
    
        if selection == "1":
            li.append("Antagonist")
        elif selection == "2":        
            li.append("Agonist")
    
    for i in range(len(cmp_list)):
        root = tk.Tk()
        var = tk.IntVar()
        ig = str(cmp_list[i] + '.png')
        img = ImageTk.PhotoImage(Image.open(ig))
        panel = tk.Label(root,image=img)
        panel.pack(side = "top",fill="none",expand="no")
        #w = tk.Text(height=2,width=50)
        #w.pack(side='right")
    
        q = tk.Radiobutton(root,text="Antagonist",command=sel,value=1,variable=var)
        q.pack()
    
        r = tk.Radiobutton(root,text="Agonist",command=sel,value=2,variable=var)
        r.pack()
        root.mainloop()
    
    print li
    

1 个答案:

答案 0 :(得分:0)

您的代码正在创建tk.Tk()的多个实例。这不是Tkinter设计工作的方式,它会产生不可预测的行为。一个合适的Tkinter程序总是只有tk.Tk()的一个实例。

如果您需要多个窗口,对于第二个和后续窗口,您应该创建tk.Toplevel的实例。

要回答您关于如何处理某人首先击中一个单选按钮然后另一个单独处理的具体问题 - 问题是您每次单击无线电按钮时都无条件地附加到您的列表中。解决方案是使用某种标记或指示符来了解是否已单击其中一个单选按钮,或更改您的代码以使其无关紧要。

让我们看看第二个选项 - 让它变得无关紧要。打开新图像时,您可以自动将值附加到列表中。在这种情况下,将其设置为None以表示尚未采摘任何内容。然后,在sel中,您将始终替换最后一个元素而不是追加新元素,因为您知道最后一个元素始终引用当前化合物。