2013-04-29 300 views
0

我正在第一次编写Tkinter程序并对单选按钮有疑问。我想要做的是:Tkinter单选按钮清除/重置值

  1. 打开一组图像(一次一个)。
  2. 打开图像时,使用单选按钮注释一个值。
  3. 在一个列表中收集该值

所以,在这个例子中我有2种化合物和列表将具有2页的注释。

我遇到的问题是,如果用户错误地单击单选按钮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 

回答

0

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

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

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

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

+0

迟到的道歉!谢谢布莱恩。我今天晚些时候会去看看。 – user2332994 2013-05-23 20:42:24