#python #tkinter #global-variables #updating
#питон #tkinter #глобальные переменные #обновление
Вопрос:
Добрый день, спасибо всем, кто смотрит на мою проблему, я создаю скрипт для начальной настройки коммутаторов через консольный порт, я могу подключиться к консольному порту. проблема возникает при создании графического интерфейса в TKINTER.
Я хочу, чтобы графический интерфейс подключался через указанный какой-либо порт при нажатии кнопки, а при установлении соединения загорался (с помощью canvas) зеленым цветом, показывая, что соединение прошло успешно.
Моя проблема заключается в том, что индикатор меняется на зеленый и остается при установлении соединения, которое я пробовал
- мой initally также пытался использовать global, а затем понял, что оконный цикл постоянно возвращает ему значение red
- вложенный цикл while — прерывает Tkinker
- импорт созданного мной файла с именем variableset, в котором хранится переменная, для которой установлен зеленый цвет, но поскольку у него постоянно появляется новый экземпляр, он просто возвращает переменной в tinker значение red.
любая помощь будет с благодарностью
КОД графического интерфейса
import tkinter as tk
from tkinter import *
import connect
import variableset
setting = variableset.setting
window = tk.Tk()
window.title("Network Wizard 1")
window.geometry('300x500')
# setting =tk.IntVar()
# setting.set(variableset.setting)
#serial port pick the right one
serialportlabel = tk.Label(text="COM Number")
serialport = tk.Entry(width= 7)
serialportlabel.pack()
serialport.pack()
#color alerting!! red bad
alert = Canvas(window, width=50, height=20)
alert.pack()
if setting == 0:
a=alert.create_rectangle(5, 0, 50, 50, fill='red')
else:
a=alert.create_rectangle(5, 0, 50, 50, fill='green')
# #connection part woop woop
connection = tk.Button(text="connect", command = lambda: bus())
connection.pack()
# #firmwarecheck
# firmwarecheck = tk.Button(text="Firmware check")
# firmwarecheck.pack()
# #firmware update
# firmwareupdate= tk.Button(text="Firmware update")
# firmwareupdate.pack()
# #software update
# software = tk.Button(text="software update")
# connect.pack()
# #vmlans
# vlanupdate = tk.Button(text="Vlanupdate")
# vlanupdate.pack()
# disconnect = tk.Button(text="disconnect")
# disconnect.pack()
# qut = tk.Button(text="quite")
# qut.pack()
def bus():
global ser
ser = connect.connect(serialport.get())
global setting
setting = variableset.initial
# def firmware(ser):
# if ser.isOpen() == true :
window.mainloop()
Код подключения
import serial
import time
import sys
#connect
def connect(com):
ser = serial.Serial(
port = com, #COM
baudrate=9600,
parity='N',
stopbits=1,
bytesize=8,
timeout=8
)
ser.isOpen()
print(ser.name)
#set variables
enter = str.encode('rn') #enter
user = str.encode('admin@sytemrn') #default user name
pwd = str.encode('rn') #defualt password
qut = str.encode('quitr')
time.sleep(1.0)
# ser.inWaiting()
ser.write(enter) #promt login
time.sleep(0.5)
ser.write(user) #enter user name
time.sleep(0.5)
ser.write(pwd) #enter password
time.sleep(0.5)
ser.write(enter)
time.sleep(0.5)
ser.write(enter)
time.sleep(0.5)
ser.write(str.encode("sytemrn"))
time.sleep(0.5)
ser.write(qut)
ser.write(qut)
input_read = ser.read(500)
input_read = input_read.decode("utf-8","ignore")
print(input_read)
ser.close()
return ser
def write(ser):
ser.write(str.encode('' 'rn'))
def disconnect(ser):
ser.write(str.encode('quitrn'))
time.sleep(.2)
ser.write(str.encode('quitrn'))
time.sleep(.2)
ser.write(str.encode('quitrn'))
time.sleep(.2)
ser.close()
Код набора переменных
global setting
setting = 0
def initial():
global setting
setting = 1
return setting
def unset():
global setting
setting = 0
return setting
Любая помощь с благодарностью
Ответ №1:
Насколько мы можем судить, ваш оператор if-else выполняется только один раз, до того, как была установлена установочная переменная. Это не цикл или функция, которая вызывается откуда-то еще. В чем именно проблема, с которой вы столкнулись с опубликованным вами кодом? Описанные вами проблемы, похоже, связаны с циклом, который возвращает ему значение red в другой версии кода.
В любом случае, я подозреваю, что ваша проблема заключается в попытке использовать бесконечные циклы для постоянной проверки настройки, что предотвращает запуск tkinter mainloop() и, следовательно, блокирует обновление графического интерфейса. Если это так, то лучший способ исправить это, вероятно, изменить ваш код для «проверьте настройку, а затем измените цвет» на его собственную функцию, которая вызывается в первый раз в конце вашей функции connect. Затем функция завершения настройки проверки должна запланировать запуск после временной задержки с использованием метода tkinter after(), который является неблокирующим (асинхронным) и позволяет mainloop() продолжать работать. Альтернативные методы включают отдельный поток для запуска кода настройки проверки или использование метода tkinter update() , но after() проще всего.
Обратите внимание, что ваши функции sleep() в коде connect также будут блокировать основной цикл во время их выполнения. Я также не понимаю, что вы пытаетесь сделать с кодом variableset; похоже, что при вызове initial() устанавливается значение 1 (иначе зеленый свет), независимо от фактического состояния последовательного порта.