2013-04-29 286 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