2014-12-26 100 views
-1

我是一名Python初學者。我在前天在stackoverflow.com上解決了線程問題。鏈接到這個問題如下:Python : creating a new process禁用按鈕的功能

現在我陷入另一個問題。在下面的代碼中,我想禁用Button OnButtonClick2的功能,我的OnButtonClick1正在執行某些操作。

import Tkinter 
import threading 
import time 
class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     self.grid() 

     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
     self.entry.grid(column=0,row=0,sticky='EW') 
     self.entry.bind("<Return>", self.OnPressEnter) 
     self.entryVariable.set(u"Enter text here.") 



     button1 = Tkinter.Button(self,text=u"Exp1 ", 
           command=self.OnButtonClick1) 
     button1.grid(column=1,row=0) 


     button2 = Tkinter.Button(self,text=u"Exp2 ", 
           command=self.OnButtonClick2) 
     button2.grid(column=1,row=1) 


     self.grid_columnconfigure(0,weight=1) 
     self.resizable(True,False) 
     self.update() 
     self.geometry(self.geometry())  
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

    def OnButtonClick1(self): 
     thr = threading.Thread(target=self.print_deep1) 
     thr.start() 
    def print_deep1(self): 
     time.sleep(10) 
     print 'deep' 


    def OnButtonClick2(self): 
     thr = threading.Thread(target=self.print_deep2) 
     thr.start() 
    def print_deep2(self): 
     while True: 
      print 'deepak' 


    def OnPressEnter(self,event): 
     self.labelVariable.set(self.entryVariable.get()+" (You pressed ENTER)") 
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('my application') 
    app.mainloop() 
+1

如果我的問題語句看起來不清楚,請告訴我。我也可以詳細說明。 –

+0

我的問題是,當我單擊Exp1按鈕和Exp2,然後Exp2不應該執行其工作(因爲Exp1仍然在做)。如何實現這一目標? –

回答

0

最簡單的(不是最好的)是指向onclick2愚蠢的功能;但是您必須知道button1上的線程何時完成工作。重命名OnButtontClick2 - onBtClick2和self.OnButtonClick2 = lambda *arg:None。線程完成作業self.OnButtonClick2 = self.onBtClick2

哦,停止命名你的方法的類。以較低的字母或snake_style開頭,更易於閱讀。

0

是下面的代碼可能是方法之一來解決問題:

import Tkinter 
import threading 
import time 

class simpleapp_tk(Tkinter.Tk): 
    global sempahore 

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

    def initialize(self): 
     self.grid() 

     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
     self.entry.grid(column=0,row=0,sticky='EW') 
     self.entry.bind("<Return>", self.OnPressEnter) 
     self.entryVariable.set(u"Enter text here.") 



     button1 = Tkinter.Button(self,text=u"Exp1 ", 
           command=self.OnButtonClick1) 
     button1.grid(column=1,row=0) 


     button2 = Tkinter.Button(self,text=u"Exp2 ", 
           command=self.OnButtonClick2) 
     button2.grid(column=1,row=1) 


     self.grid_columnconfigure(0,weight=1) 
     self.resizable(True,False) 
     self.update() 
     self.geometry(self.geometry())  
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

    def OnButtonClick1(self): 
     if (self.kick == True): 
      print 'before assignment self.kick = %s' %(self.kick,) 
      self.kick=False 
      print 'after assignment self.kick = %s' %(self.kick,) 
      thr = threading.Thread(target=self.print_deep1) 
      thr.start()   
    def print_deep1(self): 
     print 'on entering function self.kick = %s' %(self.kick,) 
     print (time.strftime("%H:%M:%S")) 
     time.sleep(10) 
     print (time.strftime("%H:%M:%S")) 
     print 'deep' 
     self.kick= True 
     print 'at end of function self.kick = %s' %(self.kick,) 


    def OnButtonClick2(self): 
     if (self.kick !=False): 
      thr = threading.Thread(target=self.print_deep2) 
      thr.start() 
    def print_deep2(self): 
     print self.kick 
     print (time.strftime("%H:%M:%S")) 
     time.sleep(5) 
     print (time.strftime("%H:%M:%S")) 
     print 'deep1' 
     self.kick= True 

    def OnPressEnter(self,event): 
     self.labelVariable.set(self.entryVariable.get()+" (You pressed ENTER)") 
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('my application') 
    app.mainloop()