안녕하세요 난 그냥 라벨 변경/루프 동안 새로 고치는 것이 원하지만파이썬 Tkinter를이 : 라벨의 루프는
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
덕분에 내 코드
안녕하세요 난 그냥 라벨 변경/루프 동안 새로 고치는 것이 원하지만파이썬 Tkinter를이 : 라벨의 루프는
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
덕분에 내 코드
,이 시도 :
from Tkinter import *
import time
root=Tk()
variable=StringVar()
def update_label():
i=0
while 1:
i=i+1
variable.set(str(i))
root.update()
your_label=Label(root,textvariable=variable)
your_label.pack()
start_button=Button(root,text="start",command=update_label)
start_button.pack()
root.mainloop()
당신에게 좋은 예를 제공해야한다고. 그러나 while 루프 중에 반드시
root.update()
을 호출해야합니다. 그렇지 않으면 루프가 완료 될 때까지 GUI가 고정되고 (이 경우
은 절대이됩니다) 번호를 표시하지 않습니다.
수update_label()
어디서든 프로그램에 액세스 할 수 있습니다. 방금 예를 들어 시작 버튼에 추가했습니다.
코드에 문제가있는 것은 while 루프를 자유롭게 설정하고 가장 중요한 것은 GUI의 메인 루프 앞에 을 설정했기 때문입니다. 이렇게하면이 루프가 무한하기 때문에 Tkinter
이 mainloop()
으로 시작하지 못하게됩니다. 그러나 while 루프를 에 넣고 메인 루프를 실행 한 다음 까지 실행하면 결코 종료되지 않습니다.을 종료하면 GUI가 종료 될 때까지 메인 루프가 무한하기 때문입니다.
이 문제를 해결하려면 간단히 함수에 넣고 나중에 Tkinter
의 메인 루프 중에 호출하십시오. 이 작업은 다양한 방법으로 수행 할 수 있습니다. 예를 들어 .after()
을 사용하여 일정 시간이 지나면 특정 작업을 수행하거나 버튼을 누르면 명령이 실행되도록 할 수 있습니다. . 당신이 정말로 당신의 코드에서 infinate 루프를하지 않으려는 그러나
, 사용해야하는 적절한 코드는 다음과 같다 (다른 당신은 돌이) :
class App (object):
def __init__(self):
self.root=Tk()
self.variable=StringVar()
self.i=0
self.your_label=Label(self.root,textvariable=self.variable)
def grid(self):
self.your_label.pack()
def update_label(self):
self.i=self.i+1
self.variable.set(str(self.i))
self.root.after(20,self.update_label)
def run(self):
self.grid()
self.root.after(20,self.update_label)
self.root.mainloop()
if __name__=='__main__':
App().run()
코드를
이
작동하지 않습니다mainloop
에 도착하지 않습니다. 이와 같은 것을보기 위해서는 mainloop에서 호출 된 콜백에서 (이벤트를 통해 간접적으로) 업데이트를 바인딩해야합니다.
여기
-1 : 전화를해서는 안됩니다 GUI의 메인 스레드에서 잠자 요. 대답에서 그렇게하면 나쁜 예가됩니다. 'update'를 호출하여 결코 멈추지 않는다고 말할 때 당신은 틀린 것입니다. 잠자기가 활성화되어있는 동안에도 UI는 절반으로 잠긴 경우에도 고정됩니다. –
@BryanOakley 알았어. 내가 바꿨어. –
아직 올바른 해결책이 아닙니다. 엄지 손가락으로 'sleep'을 호출하는 것 외에도 무한 루프가 없어야합니다. 30 초마다 레이블을 업데이트하려면 이벤트 루프를 활용하고 'after'를 사용해야합니다. –