如果要继续运行,如何销毁tkinter应用程序?

问题描述

此应用可以通过MQTT控制EV3。当它无法连接到设备时,我希望它显示错误,然后退出它,但是我无法破坏这个应用程序,因为它希望继续运行。 该代码用于销毁:

except:
        messageBox.showerror("Connection error","Failed to connect to EV3")
        mainwin.destroy()

这是错误的意思: 发生异常:TclError NULL主窗口

这就是整个代码

import tkinter as tk
from tkinter import *
from tkinter import messageBox
import paho.mqtt.client as mqtt
from tkinter import ttk
from tkinter.ttk import *
import math
import paramiko
import time
import re

mainwin = tk.Tk()
mainwin.title("EV3Dev Vezérlő")


host = "ev3dev.local"
port = 22
username = "robot"
password = "/mypassword/"

command = "service mosquitto start"
try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=host,username=username,password=password)
    session = ssh.get_transport().open_session()
    session.set_combine_stderr(True)
    session.get_pty()
    session.exec_command("sudo bash -c \"" + command + "\"")
    stdin = session.makefile('wb',-1)
    stdout = session.makefile('rb',-1)
    stdin.write(password + '\n')
    stdin.flush()
    print(stdout.read().decode("utf-8"))

    ssh.exec_command("cd /home/robot/mqtt && python3 init.py")
except:
    messageBox.showerror("Connection error","Failed to connect to EV3")
    mainwin.destroy()


fstyle = ttk.Style()
fstyle.configure('TFrame',bg="#FFFFFF")


main_frame = ttk.Frame(mainwin,style='TFrame',padding=20,relief='raised')
main_frame.grid()

broker_address="ev3dev.local"
client = mqtt.Client("client1")
client.connect(broker_address)

left_speed_label = Label(main_frame,text="Left")
left_speed_label.grid(row=0,column=0)
left_speed_entry = Entry(main_frame,width=8)
left_speed_entry.insert(0,"100")
left_speed_entry.grid(row=1,column=0)

right_speed_label = Label(main_frame,text="Right")
right_speed_label.grid(row=0,column=2)
right_speed_entry = Entry(main_frame,width=8,justify=RIGHT)
right_speed_entry.insert(0,"100")
right_speed_entry.grid(row=1,column=2)

current_speed_label = Label(main_frame,text="")
current_speed_label.grid(row=8,column=1)

def sendCMD(cmd,isnum):
    try:
        splitcmd = cmd.split()
        current_speed = "L: " + splitcmd[0] + " R: " + splitcmd[1]
        print(current_speed)
        current_speed_label.config(text=current_speed)
    except:
        pass
    client.publish("legoMqtt/sub",cmd)
    # left_speed_entry['state']='disabled'
    # right_speed_entry['state']='disabled'
    # time.sleep(0.1)
    # right_speed_entry['state']='enabled'
    # left_speed_entry['state']='enabled'

def qit():
    answ = messageBox.askokcancel("Quit","Do you want to quit?")
    if answ > 0:
        sendCMD("quit","false")
        mainwin.destroy()

def xit():
    answ = messageBox.askokcancel("Exit","Do you want to exit without stopping the programme on EV3?")
    if answ > 0:
        mainwin.destroy()

def shut():
    answ = messageBox.askokcancel("Shutdown","Do you want to turn off EV3?")
    if answ > 0:
        sendCMD("shut","false")
        mainwin.destroy()


forward = StringVar()
right = StringVar()
back = StringVar()
left = StringVar()

def frw():
    forward.set(left_speed_entry.get() + " " + right_speed_entry.get())
    sendCMD(forward.get(),"true")
def rgh():
    right.set(str(math.floor(int(left_speed_entry.get())/2)) + " " + right_speed_entry.get())
    sendCMD(right.get(),"true")
def bck():
    back.set("-" + left_speed_entry.get() + " " + "-" + right_speed_entry.get())
    sendCMD(back.get(),"true")
def lft():
    left.set(left_speed_entry.get() + " " + str(math.floor(int(right_speed_entry.get())/2)))
    sendCMD(left.get(),"true")

forward_button = Button(main_frame,text="Forward",command=lambda: frw())
forward_button.grid(row=2,column=1)
mainwin.bind('<w>',lambda event: frw())

left_button = Button(main_frame,text="Left",command=lambda: lft())
left_button.grid(row=3,column=0)
mainwin.bind('<a>',lambda event: lft())

stop_button = Button(main_frame,text="Stop",command=lambda: sendCMD("0 0","true"))
stop_button.grid(row=3,column=1)
mainwin.bind('<space>',lambda event: sendCMD("0 0","true"))

right_button = Button(main_frame,text="Right",command=lambda: rgh())
right_button.grid(row=3,column=2)
mainwin.bind('d',lambda event: rgh())

back_button = Button(main_frame,text="Back",command=lambda: bck())
back_button.grid(row=4,column=1)
mainwin.bind('<s>',lambda event: bck())

# Buttons for quit and exit
q_button = Button(main_frame,text="Quit",command=lambda: qit())
q_button.grid(row=5,column=2)

e_button = Button(main_frame,text="Exit",command=lambda: xit())
e_button.grid(row=6,column=2)

s_button = Button(main_frame,text="Shutdown",command=lambda:shut())
s_button.grid(row=6,column=0)

mainwin.mainloop()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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