微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如果要继续运行,如何销毁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 举报,一经查实,本站将立刻删除。