2016-09-06 98 views
0

我有下面的一段代码,并希望在文本框中输入一个字符串后启动线程,但只要我运行程序时线程开始执行,任何想法?当创建它的方法被执行时,该线程是否应该启动?线程无按钮事件启动Tkinter

class FuncThread(threading.Thread): 

    def __init__(self, target, *args): 
     self._target = target 
     self._args = args 
     threading.Thread.__init__(self) 

    def run(self): 
     self._target(*self._args) 


class BuildGui():   

    def show_entry_fields(self, 
         release_version=None): 
     print("Release Version: %s\n" % release_version) 
     pattern = re.compile('^\d*\.\d*\.\d*$') 
     if re.match(pattern, release_version): 
      self.thread_execute_build(release_version=release_version) 
     else: 
      print "Enter a valid release version (e.g. 5.3.2)" 
      e1.delete(0, 'end') 


    def execute_build(self, 
        release_version=None): 
     cmd_build_jenkins = 'java -jar jenkins-cli.jar -s http://xyz:8080/ build "New ESW build" -s -p "release_version"=' + str(release_version) 
     os.system(cmd_build_jenkins) 

    def thread_execute_build(self, 
         release_version=None): 
     self.build_thread = FuncThread(self.execute_build, release_version) 
     self.build_thread.start() 

if __name__ == '__main__': 

    master = Tk() 
    Label(master, text="Release Version").grid(row=0) 

    e1 = Entry(master) 

    e1.grid(row=0, column=1) 

    gui = BuildGui() 
    Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4) 
    Button(master, text='Show', command=gui.show_entry_fields(release_version=e1.get())).grid(row=3, column=1, sticky=W, pady=4) 

    mainloop() 

回答

0

我会说你需要chnage:

Button(master, text='Show', command=gui.show_entry_fields(release_version=release_version)).grid(row=3, column=1, sticky=W, pady=4) 

要:

Button(master, text='Show', command=lambda:gui.show_entry_fields(release_version=release_version)).grid(row=3, column=1, sticky=W, pady=4) 

拉姆达基本上可以让你传递参数而不是调用它。让我知道这是否有帮助。

+0

感谢它的工作! – Brunisboy