2016-03-17 78 views
0

我知道这个问题已经被问过很多次在后台运行的东西。不幸的是,没有任何答案能解决我的目的。我有一个代码将持续在一个while循环中ping并检查连通性。 ping应该实例化的频率是从用户那里获得的。除非用户关闭应用程序,否则这个ping永远不会结束。UI在Tkinter的冻结,同时我在while循环

我有2类,一个用于UI,另一个用于动作来完成。

下面是示例代码。

class Net: 

    def main(self,interval): 

     try: 
      while thread1.is_alive(): 
       p = subprocess.Popen("Do something like ping", 
             stdout = PIPE, 
             stderr = PIPE) #--> This is definitely required 

     except KeyboardInterrupt as e: 
       print "Exiting", e 



class UI: 

    def __init__(self,* args, **kwargs):   

     tk.Tk.__init__(self, *args, **kwargs) 

     self.wm_title("Network Test") 
     self.geometry('250x75') 
     self.resizable(width = False, height = False) 

     self.label = tk.Label(text = "Frequency(seconds)") 
     self.label.grid(row = 0, column = 0) 

     self.entry = tk.Entry(bd = 5) 
     self.entry.grid(row = 0, column = 1) 

     self.button = tk.Button(text = "Start Test", command = self.callthread) 

     self.button.grid(row = 1, column = 0) 

     self.button1 = tk.Button(text = "Stop Test") 
     self.button1.grid(row = 1, column = 1) 

     self.mainloop() 

    def callthread(self): 

     print "Inside Call thread" 

     n = NetTest() 
     thread2 = threading.Thread(target = n.main(int(self.entry.get()))) 
     #thread2.setDaemon(True) 
     thread2.start() 


if __name__ == "__main__": 

    thread1 = threading.Thread(target = MyUI) 

    thread1.start() 
    #print threading.activeCount() 

我试图运行它们的线程,但在vain.Perhaps我已经错误地执行线程。应用程序做它应该做的事情。唯一的问题是用户界面挂起,而我也尝试过使用后。这没有帮助。任何帮助将不胜感激。

TIA

回答

0

我已经想通了problem.The问题是,我没有打电话从run方法的主要方法()。这个例子可能对试图用Tkinter实现线程的人有所帮助,这样UI就不会冻结。

最佳解决方案是如下面给出的,以从所述重写run方法继承threading模块并调用无限循环。

class Net(threading.Thread): 

    def __init__(self, interval): 
    threading.Thread.__init__(self) 
    self.interval = interval 

    def run(self): 

    self.main() 

    def main(self,interval): 

     try: 
     while thread1.is_alive(): 
      p = subprocess.Popen("Do something like ping", 
            stdout = PIPE, 
            stderr = PIPE) #--> This is definitely required 

     except KeyboardInterrupt as e: 
      print "Exiting", e 



class UI: 

    def __init__(self,* args, **kwargs):   

    tk.Tk.__init__(self, *args, **kwargs) 

    self.wm_title("Network Test") 
    self.geometry('250x75') 
    self.resizable(width = False, height = False) 

    self.label = tk.Label(text = "Frequency(seconds)") 
    self.label.grid(row = 0, column = 0) 

    self.entry = tk.Entry(bd = 5) 
    self.entry.grid(row = 0, column = 1) 

    self.button = tk.Button(text = "Start Test", command = self.callthread) 

    self.button.grid(row = 1, column = 0) 

    self.button1 = tk.Button(text = "Stop Test") 
    self.button1.grid(row = 1, column = 1) 

    self.mainloop() 

    def callthread(self): 

     thread2 = Net(self.entry.get()) 
     thread2.start() 


if __name__ == "__main__": 

    thread1 = threading.Thread(target = MyUI) 
    thread1.start()