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函数。
答案 0 :(得分:1)
您不需要使用Timer类。 Tkinter有一种在未来运行代码的方法。 Timer类的问题在于它使用线程,而tkinter不是线程安全的。
以下是每60秒运行getlog
的示例。调用一次,它将每分钟运行一次,直到程序退出。
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
做什么的情况下,我可以更具体。
答案 1 :(得分:0)
Morris.Area({
element: 'area-example',
behaveLikeLine: true,
data: [
{ x: '2006', a: 100, b: 90 },
{ x: '2007', a: 75, b: 65 },
{ x: '2008', a: 50, b: 40 },
{ x: '2009', a: 75, b: 65 },
{ x: '2010', a: 50, b: 40 },
{ x: '2011', a: 75, b: 65 },
{ x: '2012', a: 100, b: 90 }
],
xkey: 'x',
ykeys: ['a', 'b'],
labels: ['Series A', 'Series B']
});
清理它并纠正一些错误 它现在工作正常