python tkinter GUI上位机数据显示问题。。。

孤独患者先生 2015-07-28 04:26:42
我需要做一个树莓派界面的上位机,目的是实现将单片机的数据传输在树莓派上位机上。现在通信部分已经ok..

上位机我选择了python -tkinter。。

因为是新人,刚看了几天tkinter ,,,在论坛看到了之前用tkinter 做的串口助手

使用这个串口助手,实现了数据传输。。

http://bbs.csdn.net/topics/380042753


我在这个基础上对界面进行了修改。。。
现在界面如下:





想把数据实时显示在这四个框里。。。串口点击采集以后数据是一直在传输。。我需要实时显示,四个一组,四个里面第一个第二个第三个 第四个依次显示在界面上。。需要怎么修改程序呢?





...全文
714 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
RLC谐振 2018-05-09
  • 打赏
  • 举报
回复
请问做出来了吗?我目前也在弄这个,弄了好多天弄不对,请问能发我一份吗?
孤独患者先生 2015-07-28
  • 打赏
  • 举报
回复
还有就是想问,原来串口助手里这一段还需要么。。。。

感觉上面出错是因为这块的原因。。,



孤独患者先生 2015-07-28
  • 打赏
  • 举报
回复
下面是我修改的程序,。。。因为刚开始看python ...编译能过,,但是运行有错。。。。。。有没有大神能帮忙看看
#coding=gbk
'''

'''

import sys
import ttk
import time
import Queue
import serial
import threading
import Tkinter as tk


isOpened = threading.Event()
RQueue = Queue.Queue(maxsize=1024)
TQueue = Queue.Queue(maxsize=1024)


root = tk.Tk()
ComX = tk.StringVar(root,' ')
Baud = tk.StringVar(root,"9600")
Dbit = tk.StringVar(root,'8')
Sbit = tk.StringVar(root,'1')
Chck = tk.StringVar(root,'None')

wendu1 = tk.StringVar(root,'')
shidu1 = tk.StringVar(root,'')
wendu2= tk.StringVar(root,'')
shidu2 = tk.StringVar(root,'')

HexD = tk.BooleanVar(root,False)
HexO = tk.BooleanVar(root,False)
Open = tk.StringVar(root,u'打开串口')



def main():


labe1=tk.Label(root,text=u'地 面 温 湿 度 监 测 系 统',font=(u"宋体",20),fg="red" )
labe1.pack(side='top',padx=20,pady=20)


cnv0 = tk.Canvas(root,height=10,width=580)
cnv0.pack(side='top',padx=50,pady=10,anchor='c')
cnv0.create_window( 120,15,window=ttk.Label(root,text=u'节 点1'))
cnv0.create_window( 200,15,window=ttk.Label(root,text=u'温度1:'))
cnv0.create_window(270,15,window=ttk.Entry(root,textvariable=wendu1,width=10))
cnv0.create_window(380,15,window=ttk.Label(root,text=u'湿度1:'))
cnv0.create_window(450,15,window=ttk.Entry(root,textvariable=shidu1,width=10))


cnv1 = tk.Canvas(root,height=70,width=580)
cnv1.pack(side='top',padx=50,pady=10,anchor='c')
cnv1.create_window( 120,15,window=ttk.Label(root,text=u'节 点2'))
cnv1.create_window( 200,15,window=ttk.Label(root,text=u'温度2:'))
cnv1.create_window(270,15,window=ttk.Entry(root,textvariable=wendu2,width=10))
cnv1.create_window(380,15,window=ttk.Label(root,text=u'湿度2:'))
cnv1.create_window(450,15,window=ttk.Entry(root,textvariable=shidu2,width=10))



cnv2 = tk.Canvas(root,height=20,width=580)
cnv2.pack(side='top',padx=50,pady=10,anchor='c')
cnv2.create_window( 120,15,window=ttk.Label(root,text=u'串 口'))
cnv2.create_window(250,15,window=ttk.Combobox(root,textvariable=ComX,values=['COM1', 'COM2', 'COM3','COM4','COM5'],width=15))


cnv3 = tk.Canvas(root,height=20,width=580)
cnv3.pack(side='top',padx=50,pady=10,anchor='c')
cnv3.create_window(120,15,window=ttk.Label(root,text=u'波特率'))
cnv3.create_window(250,15,window=ttk.Combobox(root,textvariable=Baud,values=['4800','9600','19200'],width=15))


cnv4 = tk.Canvas(root,height=90,width=580)
cnv4.pack(side='top',padx=50,pady=10,anchor='c')
cnv4.create_oval(118,7,134,23,fill='black',tag='led')
cnv4.create_window(250,15,window=ttk.Button(root,textvariable=Open,width=17,command=lambda:COMOpen(cnv4)))
cnv4.create_window(450,15,window=ttk.Button(root,text=u'停止',width=12))

com_thread = threading.Thread(target=COMTrce)
#com_thread.setDaemon(True)
com_thread.start()
root.bind("<<COMRxRdy>>", COMRxRdy)

root.mainloop()



COM = serial.Serial()





def COMOpen(cnv4):
if not isOpened.isSet():
try:
COM.timeout = 1
COM.xonxoff = 0
COM.port = ComX.get()
COM.parity = Chck.get()[0]
COM.baudrate = int(Baud.get())
COM.bytesize = int(Dbit.get())
COM.stopbits = int(Sbit.get())
COM.open()
except Exception:
print "串口打开失败!"
else:
isOpened.set()
Open.set(u'关闭串口')
cnv4.itemconfig('led',fill='green')
else:
COM.close()
isOpened.clear()
Open.set(u'打开串口')
cnv4.itemconfig('led',fill='black')



def COMTrce():
while True:
if isOpened.isSet():
rbuf = COM.read(1) #read one, with timout
if rbuf:
n = COM.inWaiting()
if n:
rbuf = rbuf+COM.read(n)
RQueue.put(rbuf)
else:
root.event_generate("<<COMRxRdy>>")
time.sleep(0.02)



def COMRxRdy():
wendu1, shidu1, wendu2, shidu2 = RQueue.get().split(',')

if __name__=='__main__':
isOpened.clear()
main()


这个是连接串口线执行程序时候,显示的错误。。。

孤独患者先生 2015-07-28
  • 打赏
  • 举报
回复
那个朋友留言说: 第一步:定义StringVar Temperature1 = tk.StringVar(root,'32.1') Humidity1 = tk.StringVar(root,'50') Temperature2 = tk.StringVar(root,'32.2') Humidity2 = tk.StringVar(root,'60') 第二步:放置文本框的时候绑定StringVar cnv1.create_window(192,15,window=ttk.Entry(root,textvariable=Temperature1 ,width=44)) cnv1.create_window(192,35,window=ttk.Entry(root,textvariable=Humidity1 ,width=44)) cnv1.create_window(192,55,window=ttk.Entry(root,textvariable=Temperature2 ,width=44)) cnv1.create_window(192,75,window=ttk.Entry(root,textvariable=Humidity2 ,width=44)) 第三步:在接收中解析数据并赋值给4个StringVar 首先,假设你的单片机是这样发送数据的 char buffer[50] = {0}; sprintf(buffer, "%f,%d,%f,%d", temperature1, humidity1, temperature2, humidity2) uart_sendString(buffer) 然后你要在COMTrce接收中确保你接收到完整的一个字符串之后再产生事件,,方法的的话可能是下面这样(我也也不确定是否有效): def COMTrce(): while True: if isOpened.isSet(): rbuf = COM.read(1) #read one, with timout if rbuf: n = COM.inWaiting() if n: rbuf = rbuf+COM.read(n) RQueue.put(rbuf) else: root.event_generate("<<COMRxRdy>>") time.sleep(0.02) 然后在把原来的<<COMRxRdy>>处理函数修改成: root.bind("<<COMRxRdy>>", COMRxRdy) def COMRxRdy(): Temperature1, Humidity1, Temperature1, Humidity1 = RQueue.get().split(',') =======================================================

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧