5

標準Tkinterライブラリを使用してウィンドウを作成する基本的な python クラスがあります。

import Tkinter

class GUI(Tkinter.Tk):

    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def lock_func(self):
        while 1==1:
            print "blah"

    def initialize(self):
        self.processBtn = Tkinter.Button(self, text="Process", command=self.lock_func)
        self.processBtn.pack()        

app = GUI(None)
app.mainloop()

ボタンを押してもウィンドウがProcess反応しません。実行中にプログラムを (x ボタンを使用して) 閉じることができるようにしたいと考えていますlock_func

4

3 に答える 3

4

ジェネレーターを使用してループ内の状態を保持し、yield制御を放棄してメイン ループに戻すことができます。次に、self.afterを使用してジェネレーターのメソッドを繰り返し呼び出して--nextの効果をシミュレートしますがwhile True、Tkinter のメイン ループに適した方法で実行します。

import Tkinter as tk

class App(object):
    def __init__(self, master):
        self.master = master
        self.initialize()

    def lock_func(self):
        def step():
            while True:
                print("blah")
                self.nextstep_id = self.master.after(1, nextstep)
                yield
        nextstep = step().next
        self.nextstep_id = self.master.after(1, nextstep)

    def stop(self):
        self.master.after_cancel(self.nextstep_id)
        print("stopped")

    def initialize(self):
        self.nextstep_id = 0
        self.process_button = tk.Button(self.master, text="Process",
                                        command=self.lock_func)
        self.stop_button = tk.Button(self.master, text="Stop",
                                     command=self.stop)        
        self.process_button.pack()
        self.stop_button.pack(expand='yes', fill='x')

root = tk.Tk()
app = App(root)
root.mainloop()
于 2013-08-04T00:34:50.007 に答える
3

このwindow.update()方法を使用して、何かを変更するたびに GUI をアクティブにして機能させることもできます。roots の間mainloop、これは自動的に行われますが、メインループを延長する場合は、自分で手動で行うことをお勧めします。window.update()しばらく時間がかかるループに入れます。注:windowTk()オブジェクトです

于 2013-08-04T00:30:14.573 に答える
0

1 つの方法は、スレッド化を使用することです。

import Tkinter
import thread

class GUI(Tkinter.Tk):

    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def lock_func(self):
        while 1==1:
            print "blah"

    def initialize(self):
        self.processBtn = Tkinter.Button(self, text="Process", command=lambda: thread.start_new_thread(self.lock_func, ()))
        self.processBtn.pack()        

app = GUI(None)
app.mainloop()

ただし、Python コンソールを閉じるまでは印刷され続けます。

停止するには、変数を変更する別のボタンを使用できます。

import Tkinter
import thread

class GUI(Tkinter.Tk):

    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.shouldPrint = True
        self.initialize()

    def lock_func(self):
        while self.shouldPrint:
            print "blah"

    def setShouldPrint(self, value):
        self.shouldPrint = value

    def initialize(self):
        self.processBtn = Tkinter.Button(self, text="Process", command=lambda: thread.start_new_thread(self.lock_func, ()))
        self.stopBtn = Tkinter.Button(self, text = "Stop", command = lambda: self.setShouldPrint(False))
        self.processBtn.grid(row = 1)
        self.stopBtn.grid(row = 2)


app = GUI(None)
app.mainloop()
于 2013-08-04T00:42:18.183 に答える