2016-09-06 2 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