0

初めて Tkinter プログラムを作成していますが、ラジオ ボタンについて質問があります。私がやろうとしていることはこれです:

  1. 一連の画像を (一度に 1 つずつ) 開きます。
  2. 画像を開いたときに、ラジオ ボタンを使用して値に注釈を付けます。
  3. この値をリストに集める

したがって、この例では 2 つの化合物があり、リストには 2 つの注釈があります。

私が抱えている問題は、ユーザーがラジオボタン 1 ではなく 2 をクリックして誤って修正した場合、リストには 4 つの項目 (最初の画像に 3 つ、2 番目の画像に 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
4

1 に答える 1

0

あなたのコードは の複数のインスタンスを作成していますtk.Tk()。これは、Tkinter が動作するように設計された方法ではなく、予測できない動作を引き起こします。適切な Tkinter プログラムには、常に のインスタンスが 1 つだけありますtk.Tk()

複数のウィンドウが必要な場合は、2 つ目以降のウィンドウ用に のインスタンスを作成する必要がありますtk.Toplevel

最初に1つのラジオボタンを押してから別のラジオボタンを押す人を処理する方法に関する特定の質問に答えるには、ラジオボタンをクリックするたびに無条件にリストに追加することが問題です。解決策は、ある種のフラグまたはインジケーターを使用して、ラジオボタンのいずれかがクリックされたかどうかを知るか、問題にならないようにコードを変更することです。

その 2 番目のオプションを見てみましょう。問題にならないようにします。新しい画像を開くと、リストに値を自動的に追加できます。この場合、Noneまだ何も選択されていないことを示すように設定します。次に、 ではsel、最後の要素が常に現在の化合物を参照することがわかっているため、新しい要素を追加するのではなく、常に最後の要素を置き換えます。

于 2013-04-29T17:49:59.190 に答える