TKinter 问题关闭应用程序

问题描述

我有一个很小的应用程序通过串行端口接收数字并将其显示在屏幕上。只是一个标签。我的问题是,如何关闭应用程序(窗口中没有关闭按钮或顶行(设置了overrideredirect) 我想通过在标签上右键单击鼠标来终止我的程序。一切正常,但是:

  1. 如果我使用 root.frame_destroy(),则 after 循环仍在运行,并且出现错误“无效的命令名称 GetCounter”(GetCounter 是我的后函数名称
  2. 如果我在 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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...