2017-04-11 13 views
0

メッセージボックスが表示された後に、もう一度繰り返す関数を設定します。コードの 短い例は、私は正確にメッセージボックスをn秒ごとに表示した後に関数を繰り返します。

def setInterval(func,time,args): 
    e = threading.Event() 
    while not e.wait(time): 
     func(args) 

def foo(data): 
    print data 
    aa("what") 
def aa(a): 
    print(a) 

tkMessageBox.showinfo("Regret","nope") 

setInterval(foo,5,"fsrty") 

すべてのものは大丈夫ですが、messgaeボックスが.Anyone助けてくださいその与える「応答しないエラー」が表示されたら、問題はそれだけである何をしたいのか、その下に表示されます解を見つけるには

答えて

1

スレッディングはこのtkinterとうまく動作しないので、.afterメソッドを使う必要があります。

import Tkinter as tk 
import TkMessageBox 

def setInterval(func,time,args): 
     func(args) 
     root.after(time, setInterval(func, time, args)) 
root.tk.Tk() 
root.withdraw() 
def foo(data): 
    print data 
    aa("what") 
def aa(a): 
    print(a) 

tkMessageBox.showinfo("Regret","nope") 
setInterval(foo, 5, "fsrty") 
root.mainloop() 
0

彼らはただつのスレッドとあなたのコードのdoesntの仕事からのTkを使用するのTcl/Tkのスレッドモデルに違反するとして、あなたがメインを占めていたので、スレッドとTkは、よく混ぜていない(唯一無二)糸!

>>> print('**** Active threads: %d ****' % threading.active_count()) 
**** Active threads: 1 **** 

をだからあなたが本当にちょうど別のものを作成している必要なもの:GUIはそのためunresponsibleであり、あなたがあなたのコード内の別のprintで簡単にそれを確認することができます - あなたの印刷機能ながら

は、印刷を続けます!

try: 
    import tkinter as tk 
    from tkinter import messagebox as msgbox 
except ImportError: 
    import Tkinter as tk 
    import TkMessageBox as msgbox 

import threading 


def setInterval(func,time,args): 
    e = threading.Event() 
    while not e.wait(time): 
     print('**** Active threads: %d ****' % threading.active_count()) 
     func(args) 


def foo(data): 
    print(data) 
    aa("what") 


def aa(a): 
    print(a) 


root = tk.Tk() 

print('**** Active threads: %d ****' % threading.active_count()) 
thread = threading.Thread(target=setInterval, args=(foo, 5, "fsrty")) 
msgbox.showinfo("Regret", "nope") 
thread.start() 

root.mainloop() 

しかし、ここでは別の問題だ - (あなたがmainloopをエスケープする場合)のスレッドがあなたの近くにGUIの後でも実行し続けます!あなたが何か簡単なものを達成しようとしているなら - .after()はオプションです(すばやく小さな代替)。

スレッドオブジェクトのカスタムサブクラスを作成(オーバーライド)することで、この問題を執拗に、または本当に必要とする場合は、フローを柔軟に制御できます。

try: 
    import tkinter as tk 
    from tkinter import messagebox as msgbox 
except ImportError: 
    import Tkinter as tk 
    import TkMessageBox as msgbox 

import threading 


class Thread(threading.Thread): 
    def __init__(self): 
     super(Thread, self).__init__() 
     self.running = False 
     self.function_to_execute = None 
     self._stop = threading.Event() 

    def start_thread(self, func, *args, **kwargs): 
     self.function_to_execute = (func, args, kwargs) 
     self.running = True 
     self.start() 

    def run(self): 
     print('### STARTED ###') 
     while self.running: 
      try: 
       print('### RUNNING ###') 
       function, args, kwargs = self.function_to_execute 
       function(*args, **kwargs) 
      except: 
       self.stop() 

    def stop(self): 
     print('### STOPPING ###') 
     self.running = False 
     self._stop.set() 


def setInterval(func, time, args): 
    e = threading.Event() 

    e.wait(time) 
    print('**** Active threads: %d ****' % threading.active_count()) 
    func(args) 


def foo(data): 
    print(data) 
    aa('what') 


def aa(a): 
    print(a) 


def clear(): 
    thread.stop() 

    while True: 
     try: 
      thread.is_alive() 
     except TypeError: 
      root.destroy() 
      print('### STOPPED ###') 
      print('**** Active threads: %d ****' % threading.active_count()) 
      break 


root = tk.Tk() 

thread = Thread() 
print('**** Active threads: %d ****' % threading.active_count()) 
msgbox.showinfo("Regret", "nope") 
thread.start_thread(setInterval, foo, 5, 'fsrty') 
root.protocol('WM_DELETE_WINDOW', clear) 

root.mainloop() 

ご覧のとおり、終了する前に削除しようとすると操作が複雑になりますが、機能しています。

結論:シンプルなもののために

  • から.after()は良いオプションです!
  • 複雑で長く実行されるものについて - threadingはあなたの選択です!

リンク:

+0

それが役立つたくさんありがとう私のたくさん –