1

私の目標は、ユーザー検証のために文字列変数を 2 つの異なるエントリに渡し、ユーザーが変更した値を返すことができるようにすることです。コードは 1 回実行されれば問題なく動作します。ただし、ループすると、ループの最初の反復中にのみ正しく実行されます。以降の反復では、エントリの文字列変数は空白です。

私は運が悪いと実験しupdate_idletasks()て時間睡眠をとった. Windows XP で Python 2.4 を実行しています。

# -*- coding: cp1252 -*-
import Tkinter

def retrieve_text():
    app_win.quit()

for item in range(3):

    numero_dossier = item+1
    version_dossier = item+2

    app_win = Tkinter.Tk()

    l = Tkinter.Label(app_win, text="Veuillez valider les informations suivantes et les corriger au besoin :")
    l.grid(row=0, column=0, columnspan=2)
    l.pack()

    v1 = Tkinter.StringVar()
    v1.set(numero_dossier)
    l1 = Tkinter.Label(app_win, text="Numéro de dossier:", anchor='w', justify='left')
    e1 = Tkinter.Entry(app_win, textvariable=v1)

    l1.pack()
    e1.pack()

    v2 = Tkinter.StringVar()
    v2.set(version_dossier)
    l2 = Tkinter.Label(app_win, text="Version du dossier:", anchor='w', justify='left')
    e2 = Tkinter.Entry(app_win, textvariable=v2)

    l2.pack()
    e2.pack()

    app_button = Tkinter.Button(app_win,text="OK",command=retrieve_text)
    app_button.pack()

    app_win.mainloop()

    app_win.withdraw()

    numero_dossier = e1.get().strip()
    version_dossier = e2.get().strip()

    print numero_dossier, version_dossier
4

3 に答える 3

2

This is fundamentally broken:

for item in range(3):
    ...
    app_win = Tkinter.Tk()

Tkinter is simply not designed to work this way. Your program should only ever create a single instance of the class Tk, and you should call mainloop exactly once.

于 2013-01-07T22:16:21.990 に答える
1

なぜウィジェットが複数回作成されているのかという質問には根拠がないので、それを間違いと見なします。app_winまた、インスタンスの名前Tkinter.Tkがあなたをだましている可能性があります。インスタンスTkinter.Tk化はtclインタープリターを開始し、次にtkをロードします。これは「ボーナス」としてウィンドウを提供します。

より賢明なアプローチは、ウィジェットを1回だけ作成してから、必要な複数の検証を実行することです。これに合わせて調整されたコードは次のとおりです。

import Tkinter

NUM_D = range(3)
VER_D = range(3)
CURR_D = 0

def retrieve_and_update_text():
    global CURR_D
    num_d = e1.get().strip()
    ver_d = e2.get().strip()
    print num_d, ver_d

    CURR_D = (CURR_D + 1) % 3
    v1.set(NUM_D[CURR_D] + 1)
    v2.set(VER_D[CURR_D] + 2)


root = Tkinter.Tk()

l = Tkinter.Label(root, text=u"Label")
l.grid(row=0, column=0, columnspan=2)

v1 = Tkinter.StringVar()

l1 = Tkinter.Label(root, text=u"Num", anchor='w', justify='left')
e1 = Tkinter.Entry(root, textvariable=v1)
l1.grid(row=1)
e1.grid(row=1, column=1)

v2 = Tkinter.StringVar()
l2 = Tkinter.Label(root, text=u"Ver", anchor='w', justify='left')
e2 = Tkinter.Entry(root, textvariable=v2)
l2.grid(row=2)
e2.grid(row=2, column=1)

app_button = Tkinter.Button(root, text=u"OK", command=retrieve_and_update_text)
app_button.grid(row=3)

v1.set(NUM_D[CURR_D] + 1)
v2.set(VER_D[CURR_D] + 2)

root.mainloop()
于 2013-01-08T05:26:46.173 に答える
-1

Bryan Oakley と mmgp のおかげで、必要なことを実行する次のコードを思いつくことができました。ただし、ループの反復ごとにメインループのルールが呼び出されるため、メインループのルールを破っています。すべてのコメントを歓迎します。再度、感謝します!

# -*- coding: cp1252 -*-
import Tkinter
root = Tkinter.Tk()

def retrieve_and_update_text():
    #global CURR_D
    dossier = e1.get().strip()
    version = e2.get().strip().upper()
    print dossier, version

    root.quit()

for item in range(3):

    dossier = item+1
    version = item+2

    l = Tkinter.Label(root, text=u"Veuillez valider les informations suivantes et les corriger au besoin :")
    l.grid(row=0, column=0, columnspan=2)

    v1 = Tkinter.StringVar()

    l1 = Tkinter.Label(root, text=u"Dossier :", anchor='w', justify='left')
    e1 = Tkinter.Entry(root, textvariable=v1)
    l1.grid(row=1)
    e1.grid(row=1, column=1)

    v2 = Tkinter.StringVar()
    l2 = Tkinter.Label(root, text=u"Version :", anchor='w', justify='left')
    e2 = Tkinter.Entry(root, textvariable=v2)
    l2.grid(row=2)
    e2.grid(row=2, column=1)

    app_button = Tkinter.Button(root, text=u"OK", command=retrieve_and_update_text)
    app_button.grid(row=3)

    v1.set(dossier)
    v2.set(version)

    root.mainloop()

    if item == range(3)[-1]: # if last item
        root.withdraw()
于 2013-01-08T20:07:08.887 に答える