tkinter没有以正确的速度运行

时间:2015-03-04 13:55:10

标签: python list timer tkinter

使用以下行时:

self.window.after(transList[i_ref].tTimer, self.Enter)

将tTimer设置为100,实际运行后大约为239ms。

这是因为将类值存储在列表类型变量中吗?

类别:

class TransMsg(object):

    def __init__(self):

        self.canID   = ""
        self.msgType = ""
        self.canType = ""
        self.tData0  = ""
        self.tData1  = ""
        self.tData2  = ""
        self.tData3  = ""
        self.tData4  = ""
        self.tData5  = ""
        self.tData6  = ""
        self.tData7  = ""

        self.timer   = 0
        self.DLC     = 0

创建实例:

def addToList(self,event):

        global transList

        ref = len(transList)
        t = TransMsg()

        t.canID = self.IDbox.get()
        t.DLC = self.DLCBox.get()
        t.canType = "s"
        t.msgType = "m"
        t.tData0 = self.tData0Box.get()
        t.tData1 = self.tData1Box.get()
        t.tData2 = self.tData2Box.get()
        t.tData3 = self.tData3Box.get()
        t.tData4 = self.tData4Box.get()
        t.tData5 = self.tData5Box.get()
        t.tData6 = self.tData6Box.get()
        t.tData7 = self.tData7Box.get()
        t.tTimer = self.tTimerBox.get()

        transList.append(t)

        self.Translist.insert("end","%s %d %s %s %s %s %s %s %s %s %d" %
                ( transList[ref].canID,
                 int(transList[ref].DLC),
                 transList[ref].tData0,
                 transList[ref].tData1,
                 transList[ref].tData2,
                 transList[ref].tData3,
                 transList[ref].tData4,
                 transList[ref].tData5,
                 transList[ref].tData6,
                 transList[ref].tData7,
                 int(transList[ref].tTimer)))

使用词典时,似乎没有偏离设定的时间。

以后的功能:

def Enter(self):
        global running
        items = self.Translist.curselection()
        for i in items:
            i_ref = int(i)
            if(int(transList[i_ref].tTimer) <= 0):
                system('echo "%s %s 0x%s %d 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s" >/dev/pcan33' %
                    (transList[i_ref].msgType,
                    transList[i_ref].canType,
                    transList[i_ref].canID,
                    int(transList[i_ref].DLC),
                    transList[i_ref].tData0,
                    transList[i_ref].tData1,
                    transList[i_ref].tData2,
                    transList[i_ref].tData3,
                    transList[i_ref].tData4,
                    transList[i_ref].tData5,
                    transList[i_ref].tData6,
                    transList[i_ref].tData7))

            else:
                if running == 1:
                    running = 0
                    break

                system('echo "%s %s 0x%s %d 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s" >/dev/pcan33' %
                    (transList[i_ref].msgType,
                    transList[i_ref].canType,
                    transList[i_ref].canID,
                    int(transList[i_ref].DLC),
                    transList[i_ref].tData0,
                    transList[i_ref].tData1,
                    transList[i_ref].tData2,
                    transList[i_ref].tData3,
                    transList[i_ref].tData4,
                    transList[i_ref].tData5,
                    transList[i_ref].tData6,
                    transList[i_ref].tData7))
                self.window.after(transList[i_ref].tTimer, self.Enter)

请问一些人可以澄清可能导致这种情况的原因或建议我如何调试它吗?

由于

1 个答案:

答案 0 :(得分:2)

after并不保证它会等到您指定的时间,因此它不适合精确的计时应用程序。来自effbot documentation

  

此方法注册将在给定的毫秒数后调用的回调函数。 Tkinter只保证不会在此之前调用回调;如果系统繁忙,实际延迟可能会更长。

虽然无法提供精确的精确度,但如果您将after调用尽可能高地放在函数中,则可能会更接近您所需的时间,因此操作速度不会进一步延迟发生在它和功能的开始之间。在您的情况下,请尝试将其移至system来电之上。