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

関連する問題