tkinter 之后不是 运行 以正确的速度

tkinter After not running at correct speed

当使用以下行时:

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

tTimer 设置为 100,实际运行时间约为 239 毫秒。

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

Class:

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)))

使用Dictionary时,似乎与设定的时间没有偏差。

之后的功能:

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)

有人可以澄清可能导致此问题的原因或建议我如何调试它吗?

谢谢

after不保证一定等到你指定的时间,所以不适合精确计时的应用。来自 effbot documentation:

This method registers a callback function that will be called after a given number of milliseconds. Tkinter only guarantees that the callback will not be called earlier than that; if the system is busy, the actual delay may be much longer.

虽然无法达到精确度,但如果您将 after 调用放在函数中尽可能高的位置,则可能会更接近您想要的时间,因此它不会进一步延迟它和函数开始之间发生的缓慢操作。对于您的情况,请尝试将其移动到 system 调用的正上方。