Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter GUI更新取决于串行连接_Python_Tkinter_Global Variables_Updating - Fatal编程技术网

Python Tkinter GUI更新取决于串行连接

Python Tkinter GUI更新取决于串行连接,python,tkinter,global-variables,updating,Python,Tkinter,Global Variables,Updating,下午好谢谢大家关注我的问题, 我正在构建一个脚本,通过控制台端口在交换机上进行初始配置,我可以连接到控制台端口。在TKINTER中构建GUI时会出现问题 我希望gui在按下按钮并建立连接时通过指定的某个端口进行连接,使指示灯(使用画布)变为绿色,以显示成功的连接 我的问题是当我尝试建立连接时,让灯变为绿色并保持不变 我最初也尝试使用全局,然后意识到窗口循环不断地将其设置回红色 嵌套的while循环---断开Tkinker 导入我创建的一个名为variableset的文件,该文件将变量存储为绿色

下午好谢谢大家关注我的问题, 我正在构建一个脚本,通过控制台端口在交换机上进行初始配置,我可以连接到控制台端口。在TKINTER中构建GUI时会出现问题

我希望gui在按下按钮并建立连接时通过指定的某个端口进行连接,使指示灯(使用画布)变为绿色,以显示成功的连接

我的问题是当我尝试建立连接时,让灯变为绿色并保持不变

  • 我最初也尝试使用全局,然后意识到窗口循环不断地将其设置回红色
  • 嵌套的while循环---断开Tkinker
  • 导入我创建的一个名为variableset的文件,该文件将变量存储为绿色,但由于它不断有一个新实例,所以它只是将tinker中的变量设置为红色
任何帮助都将不胜感激

图形用户界面代码

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('\r\n') #enter
    
    user = str.encode('admin@sytem\r\n') #default user name
    
    pwd = str.encode('\r\n') #defualt password
    
    qut = str.encode('quit\r')
    
    
    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("sytem\r\n"))
    
    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(''+'\r\n'))


def disconnect(ser):
    
    ser.write(str.encode('quit\r\n'))
    time.sleep(.2)
    
    ser.write(str.encode('quit\r\n'))
    time.sleep(.2)
    
    ser.write(str.encode('quit\r\n'))
    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

非常感谢您的帮助

据我们所知,在设置变量之前,if-else语句只运行一次。它不在从其他地方调用的循环或函数中。你发布的代码到底有什么问题?您描述的问题似乎与在不同版本的代码中将其设置回红色的循环有关

无论如何,我怀疑您的问题是试图使用无限循环来不断检查设置,这会阻止tkinter mainloop()运行,从而阻止GUI更新。如果是这样,修复它的最佳方法可能是将“检查设置,然后更改颜色”的代码更改为它自己的函数,该函数在connect函数结束时第一次被调用。然后,check setting函数的末尾应该使用tkinter after()方法安排自己在一段时间延迟后运行,该方法是非阻塞的(asnychrous),允许mainloop()保持运行。其他方法包括一个单独的线程来运行检查设置代码,或者使用tkinter update()方法,但after()方法最简单

注意,connect代码中的sleep()函数在运行时也会阻塞mainloop。我也不清楚您想用variableset代码做什么;调用initial()时,无论串行端口上的实际状态如何,都会将设置设置为1(也称为绿灯)