2016-10-14 4 views
0

저는 파이썬으로 프로그래밍을 시작한 지 불과 몇 달 전이었습니다. 처음부터 너무 직관적이고 재미 있습니다.Tkinter로 파이썬 3에서 함수를 멈추거나 인터럽트하는 방법

시작점 데이터 : 나는 파이썬을 실행하는 리눅스 mashine을 가지고있다. 3.2.3 GUI에 3 개의 버튼이 있는데, 하나의 기능을 시작하고 하나는 프로세스 또는 프로세스 (아이디어)를 멈추게한다. 나는 동안을 시도하고, 제외와 노력하지만, 주요 문제는 GUI (thinter가) 과정에서 그 시간에 응답하지 않는 실행되고 있다는 것이다있다

def printName1(event): 
    while button5 != True 
    print('Button 1 is pressed') 
    time.sleep(3) # just for simulation purposes to get reaction time for stopping 

    return 
print('STOP button is pressed') 

def StopButton(): 
    button5 = True 

다음과 같이

소스입니다. 입력을 저장하고 첫 번째 기능 (printName1)이 완료된 후에 실행합니다. 또한 stackoverflow를 보았지만 솔루션이 제대로 작동하지 않아 중단에 동일한 문제가있었습니다. 나는 (아마) 기본적인 질문에 사과한다. 그러나 나는 파이썬으로 매우 새롭고, 노력하고있는 검색의 며칠을 보낸다.

할 방법이 있습니까? 솔루션은 스레딩으로 만들 수 있습니까? 그러나 어떻게? 조언/도움은 정말 고맙습니다.

고맙습니다.

+1

예, 당신은 다른 스레드로 그 기능을 넣어해야합니다. GUI와 동일한 스레드에서 실행되는 모든 작업이 GUI를 차단하고 입력을 차단합니다. (경우에 따라 생성기 기능을 사용하여이 작업을 수행 할 수도 있지만 일반적으로 스레드는 "이동"방법입니다.) – UnholySheep

+0

Bryan에게 감사드립니다. 그렇다면이 함수로 시작하는 방법과 더 구체적으로 어떻게 스레딩 킬링 함수를 사용해야합니까? 나는 이것이 어떻게 작동하거나 보이게 될지 전혀 몰랐습니다. 나는 아주 단순한 구문으로 상상할 수 있지만 유선이거나 그렇지 않은 것 같습니다. – skyflyofsw

+0

몇 가지 옵션이 있습니다. 이 경우 가장 간단한 방법은'printName1'의 전체 기능을 스레드로 옮기는 것입니다. 이 솔루션은 모든 문제에 이상적이지는 않지만이 문제를 해결할 수 있습니다. 파이썬은 병렬성을 다루기 위해 [concurrent.future] (https://docs.python.org/3/library/concurrent.futures.html#module-concurrent.futures), [threading] (https : //docs.python.org/3/library/threading.html) 및 [_thread] (https://docs.python.org/3.5/library/_thread.html?highlight=thread#module-_thread)를 참조하십시오. – UnholySheep

답변

0

사용 threading.Event

import threading 
class ButtonHandler(threading.Thread): 
    def __init__(self, event): 
     threading.Thread.__init__(self) 
     self.event = event 
    def run (self): 
     while not self.event.is_set(): 
      print("Button 1 is pressed!") 
      time.sleep(3) 
     print("Button stop") 

myEvent = threading.Event() 

#The start button 
Button(root,text="start",command=lambda: ButtonHandler(myEvent).start()).pack() 



#Say this is the exit button 
Button(root, text="stop",command=lambda: myEvent.set()).pack() 
+0

Dashadower에게 답장과 코드를 보내 주셔서 감사합니다. 나는 이것이 '_initilizing'오류를 발견했다. 나는 threading. thread .__ init __ (self)라는 줄을 추가하여 문제를 해결할 수 있었지만, 프로세스를 멈추지 않고 중단 된 후에 처음부터 programm를 실행해야합니다. 나는 다시 프로그램을 실행할 수 없다. 아이디어는 button1을 여러 번 눌러 버렸지 만 언제든지 스레드를 중지하고 전체 programm를 다시 시작하지 않고 처음부터 실행하도록 할 수 있습니다. – skyflyofsw

+0

@skyflyofsw 고쳐 주셔서 감사합니다. 제 대답을 편집했습니다. 또한 중지 버튼을 누르면 스레드가 멈추지 않는다는 것을 의미합니까? – Dashadower

0

또한, Tk.after를 사용하여보고 할 수 있습니다. 스레드보다 훨씬 쉽고 직관적 인 방법을 찾았습니다. after 명령은 대기 시간을 밀리 초 단위로 취하고 그 다음에 명령을 실행합니다.

def printName1(): 
    if button5 != True: 
     print('Button 1 is pressed') 
    else: 
     print('STOP button is pressed') 
    root.after(1000,printName1) 

def stopButton(): 
    button5 = True 

root = Tk() 
app = Frame(root) 
app.pack() 

stopbtn = Button(app, text='STOP', command=stopButton) 
stopbtn.pack() 

root.after(1000,printName1) 
root.mainloop() 

어쩌면이 답변도 도움이 될 것입니다 How do you create a Tkinter GUI stop button to break an infinite loop?

관련 문제