4

コードをバックグラウンドで実行し、GUI を定期的に更新したいと考えています。どうすればこれを達成できますか?

たとえば、以下に示す GUI コードのバックグラウンドで次のようなことを実行したいとします。

x = 0

while True:
   print(x)
   x = x + 1
   time.sleep(1)

これは GUI コードです。

class GUIFramework(Frame):

    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.master.title("Volume Monitor")
        self.grid(padx=10, pady=10,sticky=N+S+E+W)
        self.CreateWidgets()

    def CreateWidgets(self):
        textOne = Entry(self, width=2)
        textOne.grid(row=1, column=0)

        listbox = Listbox(self,relief=SUNKEN)
        listbox.grid(row=5,rowspan=2,column=0,columnspan=4,sticky=N+W+S+E,pady=5)
        listbox.insert(END,"This is an alert message.")

if __name__ == "__main__":
    guiFrame = GUIFramework()
    guiFrame.mainloop()
4

2 に答える 2

9

上部のコードが何をするのかは少しわかりませんが、関数を毎秒 (または必要な秒数ごとに) 呼び出したいだけの場合は、afterメソッドを使用できます。

したがって、 で何かをしたいだけなら、textOneおそらく次のようにするでしょう:

...
textOne = Entry(self, width=2)
textOne.x = 0

def increment_textOne():
    textOne.x += 1

    # register "increment_textOne" to be called every 1 sec
    self.after(1000, increment_textOne) 

この関数をクラスのメソッドにすることができます (この場合は と呼びますcallback)。コードは次のようになります。

class Foo(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.x = 0
        self.id = self.after(1000, self.callback)

    def callback(self):
        self.x += 1
        print(self.x)
        #You can cancel the call by doing "self.after_cancel(self.id)"
        self.id = self.after(1000, self.callback)  

gui = Foo()
gui.mainloop()
于 2012-04-18T18:34:38.730 に答える
2

本当に明確な無限ループを実行したい場合は、別のスレッドを使用し、スレッド セーフ キューを介して通信する以外に選択肢はありません。ただし、かなり特殊な状況を除き、無限ループを実行する必要はありません。結局、すでに無限ループ、つまりイベント ループが実行されています。したがって、無限ループが必要だと言うとき、実際には無限ループ内で無限ループを実行する方法を尋ねています。

@mgilson は、 を使用してそれを行う方法の良い例を示していafterます。これは、スレッドを使用する前に試すことを検討する必要があります。スレッド化により、必要なことは可能になりますが、コードがかなり複雑になります。

于 2012-04-18T19:03:24.963 に答える