【问题标题】:Disabling a button's functionality禁用按钮的功能
【发布时间】:2015-02-23 13:04:21
【问题描述】:

我是 python 的初学者。我在线程方面遇到了问题,前天在 stackoverflow.com 上得到了解决。该问题的链接如下:Python : creating a new process

现在我遇到了另一个问题。在下面附加的代码中,我想在我的 OnButtonClick1 正在做某事时禁用 Button OnButtonClick2 的功能。

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()

【问题讨论】:

  • 如果我的问题陈述看起来不清楚,请告诉我。我也可以详细说明。
  • 我的问题是当我连续点击 Exp1 按钮和 Exp2 时,Exp2 不应该执行它的工作(因为 Exp1 仍在做某事)。如何做到这一点?

标签: python multithreading user-interface tkinter semaphore


【解决方案1】:

最简单的(不是最好的)是将onclick2指向哑函数;但是您必须知道 button1 上的线程何时完成工作。重命名 OnButtontClick2 - onBtClick2 和 self.OnButtonClick2 = lambda *arg:None。当线程完成工作self.OnButtonClick2 = self.onBtClick2

哦,别再把你的方法命名为类。以小写字母或snake_style开头,更易阅读。

【讨论】:

    【解决方案2】:

    下面的代码可能是解决问题的方法之一:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2022-10-12
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多