from tkinter import *
from threading import Timer
.......
def getdata(dval):
global log,entryWidget,txtf,infile,lout
ff="c:\\downloads\test\logs\\log1.log"
flog=open(ff,encoding="utf-8")
infile= flog.read()
flog.close()
def getlog(sval):
global log,entryWidget,txtf,infile,lout
txtf.delete ('1.0','end')
inf =entryWidget.get().strip()
if inf == "scan":
gdata = getdata("")
txtf.insert (END,gdata)
else:
gdata=str(datetime.now( ))+"\n"
txtf.insert (END,gdata)
gdata=""
ev=Timer(60,getlog,[lout])
ev.start()
def runscan():
global log,entryWidget,txtf,infile,lout
root =Tk()
root.title("Scan log")t
textFrame = Frame(root)
txtf= Text(textFrame,width=60,height=18,font=("MS Sans Serif bold",8))
entryWidget = Entry(textFrame)
textFrame.grid(row=200,column=200)
textFrame.bind("<Button-1>", getlog(lout)
txtf.grid(row=0,column=1)
entryWidget["width"] = 30
entryWidget.bind('<Return>',getlog(10))
entryWidget.grid(row=25,column=1)
ev=Timer(60,getlog,[10])
ev.start()
root.mainloop()
if __name__ == "__main__":
runscan()
타이머는 60 초마다 잘 작동하지만 Entrywidget은 작동하지 않습니다.
타이머를 꺼내면 Entrywidget이 정상적으로 작동합니다.
그래서 어딘가에 타이머 스레드가 위젯 입력을 잠급니다.
메인 루프의 타이머
에는 getlog 함수가 아닌 재설정 함수가 필요한 것 같습니다 .
Timer 클래스를 사용할 필요가 없습니다. Tkinter는 미래에 코드를 실행할 수있는 방법을 가지고 있습니다. Timer 클래스의 문제점은 스레드를 사용하고 tkinter가 스레드로부터 안전하지 않다는 것입니다.
다음은 getlog
60 초마다 실행하는 방법의 예입니다 . 한 번 호출하면 프로그램이 종료 될 때까지 1 분마다 실행됩니다.
def getlog():
txtf.delete ('1.0','end')
inf =entryWidget.get().strip()
if inf == "scan":
gdata = getdata("")
txtf.insert (END,gdata)
else:
gdata=str(datetime.now( ))+"\n"
txtf.insert (END,gdata)
gdata=""
txtf.after(60000, getlog)
getdata("")
차단할 수 있는 경우 에도 프로그램이 중단됩니다. 이 경우 스레드를 계속 사용해야하지만 스레드가 데이터를 가져 와서 스레드로부터 안전한 큐에 게시하고 GUI 스레드가 해당 큐를 폴링하도록해야합니다. 무엇을하는지 모르면 getdata
더 구체적으로 말할 수 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다