贡献一个wxPython和PySerial编写的串口助手程序

Mr显 2013-08-01 03:22:53

我自己写的一个基于wxPython和PySerial的串口助手程序,帮助和我一样的菜鸟入门GUI编程!!!




代码和wxFormBuilder的设计文件可以从下面的连接下载(一个积分

http://download.csdn.net/detail/xivn1987/5852193

...全文
3609 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dycbaba 2016-02-12
  • 打赏
  • 举报
回复
楼主,想找你合作一个python小程序,希望能和我联系
DerekTan 2015-12-28
  • 打赏
  • 举报
回复
感谢楼主!学习!
JimmySO 2014-11-05
  • 打赏
  • 举报
回复
楼主功德无量,好人有好报!
爱学习爱专研 2014-06-14
  • 打赏
  • 举报
回复
楼主功德无量,好人有好报!
amonkun 2013-12-19
  • 打赏
  • 举报
回复
楼主功德无量,好人有好报!
竹城小遛 2013-08-30
  • 打赏
  • 举报
回复
怎麼提示錯誤: Traceback (most recent call last): File "E:\Work\src\WX\test6.py", line 273, in <module> from wx.lib import embeddedimage ImportError: cannot import name embeddedimage
  • 打赏
  • 举报
回复
Good,I will get it!
q789789789 2013-08-02
  • 打赏
  • 举报
回复
Mr显 2013-08-01
  • 打赏
  • 举报
回复 1
剩下的:


import time
import threading


class SerialThread(threading.Thread):
    def __init__(self,Ser):
        super(SerialThread,self).__init__()
        
        self.Ser=Ser
        
        self.start()
    
    def run(self):
        while True:            
            if self.Ser.isOpen() and self.Ser.inWaiting():
                text = self.Ser.read(self.Ser.inWaiting())
                wx.CallAfter(Publisher().sendMessage('update',text))
                
            time.sleep(0.01)
                            


from wx.lib import embeddedimage

Img_inclosing = embeddedimage.PyEmbeddedImage(
    "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAAXNSR0IArs4c6QAAAARnQU1B"
    "AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABiSURBVDhPY/iPDTBgAOzK0EQxtSGL"
    "oCtG5uPXCZFFUQ/nEKMTTT/UJOJ1IusHaSZVJ1z/AGkmz70jXBfZ8QxNq+QFH8hWsm2GaiZD"
    "PyQ7IbIY8Y5HZETq5GeoS/A6AK0kAQCtTO8ROTKfPAAAAABJRU5ErkJggg==")


Img_inopening = embeddedimage.PyEmbeddedImage(
    "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1B"
    "AACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAACKSURBVDhPY/wPBAw4wDtZVawyQo9v"
    "49LCwIjNQFwGoZuCzWAmdEXEGgbSh00tioGkGAZzCLoeuIHkGIbNULCBlBiGbihGGOKMPiIl"
    "qGogyKeMb2VUcKZDIh2FooyqLgSZPBINxJfRBzxSQI6jTaRQw9swM+AupMRQZL0oXibHUHQ9"
    "GGFIiqHY1AIAg2UtGigTDxsAAAAASUVORK5CYII=")




if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = SerialFrame()
    frame.Show(True)
    app.MainLoop()

Mr显 2013-08-01
  • 打赏
  • 举报
回复 1
代码贴上来了,没积分也可以了。。。 不过代码太长,一帖发不完,只好分两个帖子发:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Oct  8 2012)
## http://www.wxformbuilder.org/
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class SerialFrameUI
###########################################################################

class SerialFrameUI ( wx.Frame ):
    
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 574,456 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
        
        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
        self.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INFOBK ) )
        self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWFRAME ) )
        
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        
        bSizer2 = wx.BoxSizer( wx.HORIZONTAL )
        
        self.m_txtMain = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE|wx.TE_READONLY )
        bSizer2.Add( self.m_txtMain, 1, wx.ALL|wx.EXPAND, 5 )
        
        
        bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 )
        
        bSizer3 = wx.BoxSizer( wx.HORIZONTAL )
        
        self.m_lblInput = wx.StaticText( self, wx.ID_ANY, u"输入框:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblInput.Wrap( -1 )
        bSizer3.Add( self.m_lblInput, 0, wx.ALL, 5 )
        
        self.m_txtInput = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer3.Add( self.m_txtInput, 1, wx.ALL, 5 )
        
        self.m_btnSend = wx.Button( self, wx.ID_ANY, u"发送", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer3.Add( self.m_btnSend, 0, wx.ALL, 5 )
        
        self.m_btnClear = wx.Button( self, wx.ID_ANY, u"清除", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer3.Add( self.m_btnClear, 0, wx.ALL, 5 )
        
        self.m_chkHEXShow = wx.CheckBox( self, wx.ID_ANY, u"HEX显示", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer3.Add( self.m_chkHEXShow, 0, wx.ALL, 5 )
        
        
        bSizer1.Add( bSizer3, 0, wx.EXPAND, 5 )
        
        bSizer4 = wx.BoxSizer( wx.HORIZONTAL )
        
        self.m_lblCOMX = wx.StaticText( self, wx.ID_ANY, u"串口号:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblCOMX.Wrap( -1 )
        bSizer4.Add( self.m_lblCOMX, 0, wx.ALL, 5 )
        
        m_cmbCOMXChoices = [ u"COM1", u"COM2", u"COM3", u"COM4", u"COM5", u"COM6", u"COM7", u"COM8", u"COM9" ]
        self.m_cmbCOMX = wx.ComboBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_cmbCOMXChoices, wx.CB_READONLY )
        self.m_cmbCOMX.SetSelection( 0 )
        self.m_cmbCOMX.SetMinSize( wx.Size( 100,-1 ) )
        
        bSizer4.Add( self.m_cmbCOMX, 0, wx.ALL, 5 )
        
        self.m_lblBaud = wx.StaticText( self, wx.ID_ANY, u"波特率:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblBaud.Wrap( -1 )
        bSizer4.Add( self.m_lblBaud, 0, wx.ALL, 5 )
        
        m_cmbBaudChoices = [ u"2400", u"4800", u"9600", u"14400", u"19200", u"28800", u"57600" ]
        self.m_cmbBaud = wx.ComboBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_cmbBaudChoices, wx.CB_READONLY )
        self.m_cmbBaud.SetSelection( 6 )
        self.m_cmbBaud.SetMinSize( wx.Size( 100,-1 ) )
        
        bSizer4.Add( self.m_cmbBaud, 0, wx.ALL, 5 )
        
        self.m_btnOpen = wx.Button( self, wx.ID_ANY, u"打开串口", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer4.Add( self.m_btnOpen, 8, wx.ALL, 5 )
        
        
        bSizer4.AddSpacer( ( 0, 0), 1, wx.EXPAND, 5 )
        
        self.m_imgStat = wx.StaticBitmap( self, wx.ID_ANY, wx.ArtProvider.GetBitmap( wx.ART_HELP, wx.ART_BUTTON ), wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_imgStat.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWFRAME ) )
        
        bSizer4.Add( self.m_imgStat, 0, wx.ALL, 5 )
        
        
        bSizer4.AddSpacer( ( 0, 0), 1, wx.EXPAND, 5 )
        
        self.m_chkHEXSend = wx.CheckBox( self, wx.ID_ANY, u"HEX发送", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer4.Add( self.m_chkHEXSend, 0, wx.ALL, 5 )
        
        
        bSizer1.Add( bSizer4, 0, wx.EXPAND, 5 )
        
        bSizer5 = wx.BoxSizer( wx.HORIZONTAL )
        
        self.m_lblData = wx.StaticText( self, wx.ID_ANY, u"数据位:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblData.Wrap( -1 )
        bSizer5.Add( self.m_lblData, 0, wx.ALL, 5 )
        
        m_cmbDataChoices = [ u"5", u"6", u"7", u"8" ]
        self.m_cmbData = wx.ComboBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_cmbDataChoices, wx.CB_READONLY )
        self.m_cmbData.SetSelection( 3 )
        self.m_cmbData.SetMinSize( wx.Size( 100,-1 ) )
        
        bSizer5.Add( self.m_cmbData, 0, wx.ALL, 5 )
        
        self.m_lblChek = wx.StaticText( self, wx.ID_ANY, u"校验位:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblChek.Wrap( -1 )
        bSizer5.Add( self.m_lblChek, 0, wx.ALL, 5 )
        
        m_cmbChekChoices = [ u"None", u"Odd", u"Even", u"One", u"Zero" ]
        self.m_cmbChek = wx.ComboBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_cmbChekChoices, wx.CB_READONLY )
        self.m_cmbChek.SetSelection( 0 )
        self.m_cmbChek.SetMinSize( wx.Size( 100,-1 ) )
        
        bSizer5.Add( self.m_cmbChek, 0, wx.ALL, 5 )
        
        self.m_lblStop = wx.StaticText( self, wx.ID_ANY, u"停止位:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_lblStop.Wrap( -1 )
        bSizer5.Add( self.m_lblStop, 0, wx.ALL, 5 )
        
        m_cmbStopChoices = [ u"1", u"2" ]
        self.m_cmbStop = wx.ComboBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_cmbStopChoices, wx.CB_READONLY )
        self.m_cmbStop.SetSelection( 0 )
        self.m_cmbStop.SetMinSize( wx.Size( 100,-1 ) )
        
        bSizer5.Add( self.m_cmbStop, 0, wx.ALL, 5 )
        
        self.m_btnExtn = wx.Button( self, wx.ID_ANY, u"扩展", wx.DefaultPosition, wx.Size( 50,-1 ), 0 )
        bSizer5.Add( self.m_btnExtn, 0, wx.ALL, 5 )
        
        
        bSizer5.AddSpacer( ( 10, 0), 1, wx.EXPAND, 5 )
        
        
        bSizer1.Add( bSizer5, 0, wx.EXPAND, 5 )
        
        
        self.SetSizer( bSizer1 )
        self.Layout()
        
        self.Centre( wx.BOTH )
        
        # Connect Events
        self.m_btnSend.Bind( wx.EVT_BUTTON, self.on_btnSend_clicked )
        self.m_btnClear.Bind( wx.EVT_BUTTON, self.on_btnClear_clicked )
        self.m_chkHEXShow.Bind( wx.EVT_CHECKBOX, self.on_chkHEXShow_changed )
        self.m_cmbBaud.Bind( wx.EVT_COMBOBOX, self.on_cmbBaud_changled )
        self.m_btnOpen.Bind( wx.EVT_BUTTON, self.on_btnOpen_clicked )
        self.m_btnExtn.Bind( wx.EVT_BUTTON, self.on_btnExtn_clicked )
    
    def __del__( self ):
        pass
    
    
    # Virtual event handlers, overide them in your derived class
    def on_btnSend_clicked( self, event ):
        event.Skip()
    
    def on_btnClear_clicked( self, event ):
        event.Skip()
    
    def on_chkHEXShow_changed( self, event ):
        event.Skip()
    
    def on_cmbBaud_changled( self, event ):
        event.Skip()
    
    def on_btnOpen_clicked( self, event ):
        event.Skip()
    
    def on_btnExtn_clicked( self, event ):
        event.Skip()
    


from serial import Serial
from wx.lib.pubsub import Publisher


class SerialFrame(SerialFrameUI):
    def __init__(self,parent=None):
        super(SerialFrame,self).__init__(parent)
        
        self.m_imgStat.SetBitmap(Img_inclosing.getBitmap())
        
        self.Ser = Serial()
        self.serialThread = SerialThread(self.Ser)
        
        #create a pubsub receiver
        Publisher().subscribe(self.on_txtMain_update,'update')    
        
    def on_txtMain_update(self, msg):
        self.m_txtMain.AppendText(msg.data)
    
    def on_btnSend_clicked( self, event ):
        self.Ser.write(self.m_txtInput.GetValue())
        
    def on_btnClear_clicked( self, event ):
        self.m_txtMain.Clear()
    
    def on_chkHEXShow_changed( self, event ):
        s = self.m_txtMain.GetValue()
        if self.m_chkHEXShow.IsChecked():
            s = ''.join('%02X' %i for i in [ord(c) for c in s])
        else:
            s = ''.join([chr(int(i,16)) for i in [s[i*2:i*2+2] for i in range(0,len(s)/2)]])
        self.m_txtMain.Clear()
        self.m_txtMain.SetValue(s)
        
    def on_cmbBaud_changled( self, event ):
        self.Ser.setBaudrate(int(self.m_cmbBaud.GetValue()))
        
    def on_btnOpen_clicked( self, event ):
        if not self.Ser.isOpen():
            try:
                self.Ser.timeout = 1
                self.Ser.xonxoff = 0
                self.Ser.port = self.m_cmbCOMX.GetValue()
                self.Ser.parity = self.m_cmbChek.GetValue()[0]
                self.Ser.baudrate = int(self.m_cmbBaud.GetValue())
                self.Ser.bytesize = int(self.m_cmbData.GetValue())
                self.Ser.stopbits = int(self.m_cmbStop.GetValue())
                self.Ser.open()
            except Exception,e:
                print 'COMM Open Fail!!',e
            else:
                self.m_btnOpen.SetLabel(u'关闭串口')
                self.m_imgStat.SetBitmap(Img_inopening.getBitmap())
        else:
            self.Ser.close()
            while self.Ser.isOpen(): pass

            self.m_btnOpen.SetLabel(u'打开串口')
            self.m_imgStat.SetBitmap(Img_inclosing.getBitmap())

    
    def on_btnExtn_clicked( self, event ):
        event.Skip()
本课程采用了漫画+动手实操+练习讲授Python编程技能。课程简介:第11章 常用内置模块11.1 数学计算模块 —— math模块11.2 日期时间模块 —— datetime模块11.2.1 datetime类11.2.2 date类11.2.3 time类11.2.4 计算时间跨度类——timedelta11.2.5 将日期时间对象与字符串相互转换11.3 正则表达式模块 —— re模块11.3.1 字符串匹配11.3.2 字符串查找11.3.3 字符串替换11.3.4 字符串分割11.5 练一练第12章 文件读写12.1 打开文件12.2 关闭文件12.2.1 在finally代码块中关闭文件12.2.2 在with as代码块中关闭文件12.3 读写文本文件12.4 动动手 —— 复制文本文件12.5 读写二进制文件12.6 动动手 —— 复制二进制文件12.1 练一练第13章 图形用户界面13.1 Python中的图形用户界面开发库13.2 安装wxPython17813.3 第一个wxPython程序18013.4 自定义窗口类18213.5 在窗口中添加控件18213.6 事件处理18413.7 布局管理18513.7.1 盒子布局管理器18613.7.2 动动手——重构事件处理示例13.7.3 动动手——盒子布局管理器嵌套示例13.8 控件13.8.1 文本输入控件13.8.2 复选框和单选按钮13.8.3 列表13.8.4 静态图片控件13.9 点拨点拨 —— 如何使用wxPython官方文档13.10 练一练第14章 网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求14.4 JSON数据14.4.1 JSON文档的结构14.4.2 对JSON数据的解码14.5 动动手 —— 下载图片示例14.6 动动手 —— 返回所有备忘录信息14.7 练一练第15章 访问数据库15.1 SQLite15.1.1 SQLite的数据类型15.1.2 Python的数据类型与SQLite的数据类型的映射15.1.3 使用GUI管理工具管理SQLite15.2 数据库编程的基本操作过程15.3.1 数据库连接对象Connection15.3.2 游标对象Cursor15.4 动动手 —— 数据库的CRUD操作示例15.4.1 示例中的数据表15.4.2 无条件查询15.4.3 有条件查询15.4.4 插入数据15.4.5 更新数据15.4.6 删除数据15.5 点拨点拨 —— 防止SQL注入攻击15.6 练一练第16章 多线程16.1 线程相关的知识16.1.1 进程16.1.2 线程16.1.3 主线程16.2 线程模块 —— threading模块16.3 创建子线程16.3.1 自定义函数实现线程体16.3.2 自定义线程类实现线程体16.4 线程管理16.4.1 等待线程结束16.4.2 线程停止16.5 动动手 —— 下载图片示例16.6 练一练

37,721

社区成员

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

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