Ste*_*eve 3 tkinter pyserial python-2.7
我对python和pyserial很新.我的电脑安装了python 2.7.4与pyserial,我想在我的电脑上的一个单独的窗口打印串行接收的数据.首先必须打开窗口,然后在该窗口上打印串行数据.这里窗口必须打开一次,并且必须在窗口上连续打印串行数据,直到设备停止传送数据为止.我试过这个代码,但它一文不值.请有人帮我提供代码.
import serial
import Tkinter
from Tkinter import *
s = serial.Serial('COM10',9600) # open serial port
master = Tk()
master.geometry("1360x750") # a window pop up with width (1360) and height(750) which exatly fits my monitor screen..
while 1:
if s.inWaiting():
text = s.readline(s.inWaiting())
frameLabel = Frame( master, padx=40, pady =40)
frameLabel.pack()
w = Text( frameLabel, wrap='word', font="TimesNewRoman 37")
w.insert(12.0,text )
w.pack()
w.configure( bg=master.cget('bg'), relief='flat', state='Normal' )
mainloop()
Run Code Online (Sandbox Code Playgroud)
这里的问题是你有两个应该持续运行的循环:GUI的主循环和传输串行数据的循环.你可以做的就是启动一个新的线程来接收串口的内容,把它放在一个Queue,并在GUI线程中定期检查这个队列的内容:
import serial
import threading
import Queue
import Tkinter as tk
class SerialThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
s = serial.Serial('COM10',9600)
while True:
if s.inWaiting():
text = s.readline(s.inWaiting())
self.queue.put(text)
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.geometry("1360x750")
frameLabel = tk.Frame(self, padx=40, pady =40)
self.text = tk.Text(frameLabel, wrap='word', font='TimesNewRoman 37',
bg=self.cget('bg'), relief='flat')
frameLabel.pack()
self.text.pack()
self.queue = Queue.Queue()
thread = SerialThread(self.queue)
thread.start()
self.process_serial()
def process_serial(self):
while self.queue.qsize():
try:
self.text.delete(1.0, 'end')
self.text.insert('end', self.queue.get())
except Queue.Empty:
pass
self.after(100, self.process_serial)
app = App()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)
我没有尝试过这个程序,但我认为你可以全面了解如何使用它.
| 归档时间: |
|
| 查看次数: |
11207 次 |
| 最近记录: |