t在未以正确速度运行后发生故障

2024-04-24 12:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下行时:

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

当tTimer设置为100时,实际运行时间约为239ms

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

班级:

^{pr2}$

实例创建:

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)

有人能解释一下是什么引起的吗?或者告诉我如何调试它?在

谢谢


Tags: selfrefgetintdlccanidtdata1tdata0
1条回答
网友
1楼 · 发布于 2024-04-24 12:37:57

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调用的正上方。在

相关问题 更多 >