2014-12-26 102 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()