【发布时间】:2015-01-14 05:18:03
【问题描述】:
我想制作一个可以打开串口、在文本小部件中显示接收到的值并关闭它的 gui。打开串行端口已完成,但我找不到在文本小部件中显示接收到的值的方法。此外,当我单击打开按钮时,gui 没有响应。这是因为 while 循环用于显示串口数据。我认为必须有串口数据接收事件,但我对此一无所知。如何在文本框中显示串口数据并在端口打开后使其他按钮响应。
from tkinter import *
import serial
root = None
class serial_window(Frame):
ser = serial.Serial()
#open = 0
def serial_open(self):
if (serial_window.ser.isOpen() == 0):
serial_window.ser.baudrate = 9600
serial_window.ser.port = 4-1
serial_window.ser.open()
self.after_idle(self.writeline) #while True:
print(serial_window.ser.readline())
def serial_close(self):
if (serial_window.ser.isOpen() == 1):
serial_window.ser.close()
def open(self):
self.OPEN = Button(self, text = "OPEN", fg = "blue", command = self.serial_open)
#self.OPEN["command"] = self.open_port
self.OPEN.grid(row = 0, column = 0)
def close(self):
self.CLOSE = Button(self, text = "CLOSE", fg = "blue", command = self.serial_close)
#self.OPEN["command"] = self.open_port
self.CLOSE.grid(row = 0, column = 1)
def exit_main(self):
self.exit_main = Button(self, text = "EXIT", fg = "red", command = self.quit)
self.exit_main.grid(row = 0, column = 2)
def console(self):
self.console = Text(self, fg = "red")
self.console.grid(row = 1, column = 0, columnspan = 3)
def writeline(self, event):
self.console.insert('insert', serial_window.ser.readline())
if serial_window.ser.isOpen():
self.after_idle(self.writeline)
def createWidgets(self):
self.open()
self.close()
self.exit_main()
self.console()
def __init__(self, master = None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = serial_window(master = root)
app.mainloop()
root.destroy()
从串口连续接收到的数据是-'Monitoring \r\n'
【问题讨论】:
-
很难复制您的问题,因为它取决于从实际串行端口读取。您能否修改它使其不依赖于它,而是读取数据,例如一个文件或一个预定义的列表。
标签: python-3.x text tkinter pyserial