tkinter计时器与条目小部件一起使用

时间:2015-11-05 15:14:44

标签: python-3.x tkinter timer widget tkinter-entry

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函数。

2 个答案:

答案 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']
});

清理它并纠正一些错误 它现在工作正常