【发布时间】:2021-03-19 21:35:42
【问题描述】:
我有一个 GUI 可以做一些事情,然后重新启动面板,然后等待面板完成重新启动。这个想法是让用户按下“PROGRAM HMI”,它将执行动作()。我最大的问题是在重启过程中,GUI 需要等待 10 秒才能让 HMI 重启。在这 10 秒内,GUI 冻结,顶部出现“窗口无响应”消息。正如我在终端中看到的那样,代码正在执行,它的 GUI 最终解冻。我读过我不应该在这里使用 time.sleep() 。但是我应该怎么写它才不会冻结?我正在使用 python 3.8。
import requests
import json
import time
import warnings
import subprocess
import xml.etree.ElementTree as ET
from ftplib import FTP
import hashlib
from datetime import datetime
import sys
import tkinter as tk
import time
import threading
from tkinter import *
class main:
def __init__(self):
self.window = tk.Tk()
self.window.title("1750+ HMI Setup App")
self.window.geometry("550x675")
self.window.resizable(width=False, height=False)
self.window.configure(bg='#34aeeb')
self.action_updateIP = False
self.ipString = "192.168.0.20" # Should be found by DHCP server.
self.newIPString = "192.168.0.20" # Default.
self.url = "https://" + self.ipString + "/" # TODO: Get IP address based on DHCP of panel, or fixed 192.168.0.1 if it exists?
self.urlConfig = self.url + "machine_config/"
self.urlApi = self.url + "rest/api/v1/"
self.authData = ('admin', 'admin')
#OUTPUT TEXT BOX
self.outText = Text(self.window, width=50, height=20, wrap=WORD)
self.outText.grid(row=10, columnspan=3, padx=10)
self.make_widgets()
self.window.mainloop()
def make_widgets(self):
Button(self.window, text='Select All', font=("Arial", 12), width=10, command=self.select_all).grid(row=7, sticky=W, padx=10, pady=20)
ButtonShow = tk.Button(text="Program HMI", width=20, font=("Arial", 14), command=self.actions)
ButtonShow.grid(column=0, row=8, sticky=W, padx=10, pady=10)
def verboseSleep(self,seconds):
chars = len(str(seconds))
s = "{:" + str(chars) + "d}s"
cntdn = seconds + 1
for i in range(seconds, 0, -1):
sys.stdout.write(str("\b" * (chars+1)) + s.format(i))
cntdn = cntdn - 1
msg_seconds = str(cntdn)
self.outText.insert(tk.END, str(cntdn))
pos = self.outText.index('end')
float_pos = float(pos) - 1.0
self.window.update_idletasks()
sys.stdout.flush()
self.window.after(1000)
self.outText.delete(str(float_pos), "end")
self.outText.insert(tk.END, "\n")
sys.stdout.write(str("\b" * (chars + 1))) # Remove all evidence of our countdown timer.
sys.stdout.flush()
def select_all(self):
self.action_updateIP = True
def actions(self):
##########################################################
ipString = "192.168.0.20" # Should be found by DHCP server.
newIPString = "192.168.0.20" # Default.
self.outText.delete(1.0, END)
#print (self.action_updateIP)
if self.action_updateIP == True:
print("Updating IP address...")
self.outText.insert(tk.END, "Updating IP address...")
self.window.update_idletasks()
postData = {"bridge":{"enabled":False,"interfaces":["eth0"],"list":[]},"wifi":{"interfaces":[]},"version":0,"dns":{"servers":[],"search":[]},"hostname":"HMI-2133","interfaces":[{"name":"eth0","label":"WAN","mac_address":"00:30:d8:06:21:33","dhcp":False,"configured":True,"readonly":False,"virtual":False,"hidden":False,"actual_netmask":"255.255.255.0","actual_ip_address":ipString,"ip_address":newIPString,"netmask":"255.255.255.0","gateway_ip":"192.168.0.100"},{"name":"lo","mac_address":"00:00:00:00:00:00","dhcp":False,"configured":True,"readonly":True,"virtual":True,"hidden":True,"actual_netmask":"255.0.0.0","actual_ip_address":"127.0.0.1"}]}
try:
# We expect this to fail due to the connection being abruptly ended by the panel...
r = requests.post(url = urlApi + 'network', data = json.dumps(postData), timeout = 10, headers={"content-type": "application/json"}, auth=authData, verify=False)
except:
print("Waiting 10s for panel to update.")
self.outText.insert(tk.END, "Waiting 10s for panel to update" + "\n")
self.window.update_idletasks()
self.verboseSleep(10)
print("IP Updated. New IP: ", newIPString)
msg_newIP = "IP Updated. New IP: " + newIPString + "\n"
self.outText.insert(tk.END, msg_newIP)
self.window.update_idletasks()
self.ipString = self.newIPString
else:
print (self.action_updateIP)
print ('Done!' + "\n")
self.outText.insert(tk.END, "Done! DONE! I'm all DONE!!" +"\n")
main()
exit(0)
【问题讨论】:
-
能否请您发送其余代码?例如,
window是什么? -
我更新了窗口定义。整个代码很长。我希望我已经捕获了足够的信息。我可以根据需要更新。基本上,它需要做一些事情,等待10秒,做更多的事情。但在这 10 秒内,GUI 冻结。
标签: python python-3.x tkinter tk