2017-09-17 2 views
0

GUI 프로그래밍을 위해 appJarpython3에 대한 직접 사용 경험을 얻으려고합니다. 단추를 누를 때 발생하는 동작을 추가하려고합니다. 그것은 정상적으로 작동하지만 그것은 이상하게 끝납니다.appJar 파이썬 : 버튼 누름 동작

코드의 일부는 다음과 같습니다. 버튼을 누를 때마다 "pressed"함수가 호출됩니다. 그것은 잘 작동합니다. 그러나 카운트가 0에 도달하면 숫자 0은 누르지 않습니다 (코드 당 0이 "lb1"레이블에 인쇄되어야 함). 버튼을 누르고 count 변수가 1이면 count 변수가 1 씩 감소해야하고 레이블 텍스트는 새 카운트 수로 업데이트되어야합니다. 그런 다음 counter = 0인지 확인하고 true이면 코드를 종료합니다. 이제 새 값으로 레이블을 업데이트하기 전에 양식이 종료됩니다. 일부 문제 해결과 함께, 레이블 값이 업데이트 된 코드 줄이 이미 실행되었지만 폼의 종료시에만 업데이트된다는 것을 알았습니다.

누구나이 문제에 대해 밝힐 수 있습니까?

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count==0: 
     win.stop() 

답변

0

나는 당신이보고있는 것이 예상 된 행동이라고 생각합니다.

카운트가 0에 도달하면 레이블 업데이트가 대기 상태가되지만 다음 코드 행이 GUI를 중지합니다. 몇 밀리 초 후에 발생하므로 업데이트 할 기회가 오기 전에 GUI가 사라집니다. 화면에 무엇이 보이는지.

레이블 업데이트와 GUI 닫기 사이에 약간의 지연이 생길 경우 .after() 함수를 사용할 수 있습니다. 예를 들어

는 :

if count == 0: 
    win.after(500, win.stop) 

이 정지 함수를 호출하기 전에 500 밀리 초 지연됩니다. 당신이 GUI는 Count= 0를 표시, 개방 유지, 오직 사용자가 버튼을 누르면 다음 시간을 닫으려는 경우


또는 만 win.stop()count == -1


를 호출하는 원래의 코드를 변경 전체 코드는 다음과 같이 보일 수 있습니다.

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count == 0: 
     win.after(500, win.stop) 

win = gui() 
win.addLabel("lb1", "empty") 
win.addButton("PRESS", pressed) 
win.go() 
+0

답장을 보내 주셔서 대단히 감사합니다. win.stop() 전에 sleep()을 사용했지만 작동하지 않았습니다. 레이블은 함수 종료시에만 업데이트됩니다. 해결책을 시도했습니다. 당신이 설명하는대로 작동하지 않았습니다. .after()를 사용했지만 어떤 값을 사용하든 카운터가 0에 도달하면 GUI 양식이 즉시 종료됩니다. 그럼에도 불구하고 프로그램은 지연이 끝났습니다 (콘솔에서 볼 수 있습니다). 그러나 GUI는 아닙니다. 즉, GUI 양식은 즉시 종료되지만 프로그램은 _delay_ 값에 대해 계속 실행됩니다. .after() 메서드는 GUI가 종료 된 후에 지연이 추가된다는 결론을 내릴 수 있습니다. –

+0

'sleep()'을 사용하면 GUI 스레드가 일시 중지되어 모든 업데이트가 발생하지 않습니다. 'sleep()'이 끝나면 GUI는 즉시 종료 될 것이므로 레이블 업데이트가 보이지 않을 것이다. 예제 코드 목록을 포함하도록 원래 답변을 업데이트했습니다. '.after()'는 GUI의 이벤트 루프에 함수 호출을 대기시키기 때문에 GUI는 업데이트되고 지정된 밀리 초 (이 경우 500)가 지나면 GUI가 종료됩니다. –

+0

대단히 감사합니다. 그것은 그 문제를 해결했습니다.코드를 면밀히 검사 한 결과, .after() 메소드를 정확하게 사용하지 않는다는 것을 알았습니다. 그래서 win.after (200, win.stop())를 대신에 win.after (200, win.stop) 그 이유는 처음으로 작동하지 않았다. 이제는 성공적으로 작동합니다. 고맙습니다. –