问题描述
我有一个很小的应用程序通过串行端口接收数字并将其显示在屏幕上。只是一个标签。我的问题是,如何关闭应用程序(窗口中没有关闭按钮或顶行(设置了overrideredirect) 我想通过在标签上右键单击鼠标来终止我的程序。一切正常,但是:
- 如果我使用
root.frame_destroy()
,则 after 循环仍在运行,并且出现错误“无效的命令名称 GetCounter”(GetCounter 是我的后函数名称) - 如果我在
root.after_cancel(ID)
之前使用destroy()
,我会收到 Tcl 错误:无法删除 Tcl 命令
TKInter 应用程序被封装为一个类。我在不同的计算机上运行它,所以我现在无法提供代码片段,但我希望我的问题仍然很清楚
我怎样才能让它运行起来? 我对 python 很陌生
TIA
瓦尔德马
这是我的最小代码,现在可以使用了!
import serial
import tkinter as tk
import tkinter.font as tkFont
import time
nr = 0
def incTimer(self):
global nr
nr += 1
class App:
def __init__(self,frame):
self.Running = True
self.afterID = 0
frame.Field = tk.Label(
foreground="black",background="green",font=("Arial",30,"bold"),width=4,height=2)
frame.Field2 = tk.Label(
foreground = "black",background = "white",width = 8,height = 1,font = ("Arial",12,"bold")
)
self.frame = frame
frame.Field2.pack()
frame.Field.pack()
frame.Field.bind('<Button>',self.BClick)
self.fr = frame
self.Port = "COM3:"
self.Position = "100x130+0+0"
self.Baudrate = 115200
self.MaxSmiley = 11
self.Enter = 11
self.TimeOut = 15
self.HeartBeat = 99
self.Debug =True
self.ser = serial.Serial(self.Port,self.Baudrate,timeout = 0)
frame.geometry(self.Position)
frame.overrideredirect(True)
self.fr.Field2.config(text=" ")
self.fr.Field.config(text=" ")
def BClick(self,event):
print('Button: {}'.format(event.num))
if event.num == 3:
self.Running = False
self.frame.Field.after_cancel(self.afterID)
self.frame.Field2.after_cancel(self.afterID)
self.frame.destroy()
def GetCounter(self):
global nr
if self.Debug:
msg = str(nr)
loopdelay = 1000
else:
msg=self.ser.read(2)
if len(msg) < 2:
msg='88'
loopdelay = 100
f = int(msg) - 1
if f == self.Enter:
self.fr.Field2.config(text="ENTER")
if f == self.TimeOut:
self.fr.Field2.config(text="TIMEOUT")
if f == self.HeartBeat:
self.fr.Field2.config(text=" ")
if f < self.MaxSmiley:
self.fr.Field.config(text=str(f))
self.fr.Field2.config(text=" ")
nr += 1
if nr > 32: nr = 1
self.afterID = self.fr.Field.after(loopdelay,self.GetCounter)
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
app.GetCounter()
root.mainloop()
解决方法
如果我明白你的意思,你可以简单地root.destroy()