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
调用的正上方。
当使用以下行时:
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
调用的正上方。