3

こんにちは私はループ中にラベルを変更/更新したかったのですが、機能しません

これは私のコードです

fen1 = Tk()

v = StringVar()
Label(fen1,textvariable=v).pack()

i=0

while(1):
    i=i+1
    v.set(i)
fen1.mainloop() 

ありがとう

4

2 に答える 2

12

ここで、これを試してください:

from Tkinter import *
import time
root=Tk()

variable=StringVar()

def update_label():
    i=0
    while 1:
        i=i+1
        variable.set(str(i))
        root.update()

your_label=Label(root,textvariable=variable)
your_label.pack()
start_button=Button(root,text="start",command=update_label)
start_button.pack()
root.mainloop()

それはあなたに良い例を与えるはずです。ただし、while ループ中に呼び出す必要があることに注意してroot.update()ください。そうしないと、ループが完了するまで GUI がフリーズし (この場合は実行されません)、数値が表示されません。

また、プログラムのどこからでも呼び出すことができることに注意してください。update_label()例として、スタートボタンに追加しました。

コードの問題点は、while ループをフリー フローティングに設定し、最も重要なこととして、GUI のメインループの前に設定したことです。これを行うと、このループは無限であるため、Tkinter開始することはできませんmainloop()。ただし、 mainloop の後に while ループを配置すると、GUI を終了するまで実行されません。これは、mainloop が停止する (GUI を閉じる) まで無限であるためです。

したがって、これを修正するには、単に関数に入れて、後でTkinterのメインループ中に呼び出すだけです。これもさまざまな方法で実行できます。たとえば、.after()一定時間後に特定のタスクを実行するために使用したり、ボタンを押したときに実行されるコマンドにすることができます。.

ただし、コード内に無限ループを実際に必要としないため (メインループ以外)、使用する必要がある適切なコードは次のとおりです。

class App (object):
    def __init__(self):
        self.root=Tk()
        self.variable=StringVar()
        self.i=0
        self.your_label=Label(self.root,textvariable=self.variable)
    def grid(self):
        self.your_label.pack()
    def update_label(self):
        self.i=self.i+1
        self.variable.set(str(self.i))
        self.root.after(20,self.update_label)
    def run(self):
        self.grid()
        self.root.after(20,self.update_label)
        self.root.mainloop()

if __name__=='__main__':
    App().run()
于 2012-07-03T01:49:38.747 に答える
0

あなたのコードはmainloop. このようなものを確認するには、メインループで呼び出されるコールバックで更新をバインドする必要があります (間接的に、イベントを介して)。

于 2012-07-03T01:26:54.180 に答える