使用Python3+PyQT5+Pyserial 实现简单的串口工具方法

练手项目,先上图

先实现一个简单的串口工具,为之后的上位机做准备

代码如下:

github 下载地址

pyserial_demo.py

import sys
import serial
import serial.tools.list_ports
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import QTimer
from ui_demo_1 import Ui_Form

class Pyqt5_Serial(QtWidgets.QWidget, Ui_Form):
  def __init__(self):
    super(Pyqt5_Serial, self).__init__()
    self.setupUi(self)
    self.init()
    self.setWindowTitle("串口小助手")
    self.ser = serial.Serial()
    self.port_check()

    # 接收数据和发送数据数目置零
    self.data_num_received = 0
    self.lineEdit.setText(str(self.data_num_received))
    self.data_num_sended = 0
    self.lineEdit_2.setText(str(self.data_num_sended))

  def init(self):
    # 串口检测按钮
    self.s1__box_1.clicked.connect(self.port_check)

    # 串口信息显示
    self.s1__box_2.currentTextChanged.connect(self.port_imf)

    # 打开串口按钮
    self.open_button.clicked.connect(self.port_open)

    # 关闭串口按钮
    self.close_button.clicked.connect(self.port_close)

    # 发送数据按钮
    self.s3__send_button.clicked.connect(self.data_send)

    # 定时发送数据
    self.timer_send = QTimer()
    self.timer_send.timeout.connect(self.data_send)
    self.timer_send_cb.stateChanged.connect(self.data_send_timer)

    # 定时器接收数据
    self.timer = QTimer(self)
    self.timer.timeout.connect(self.data_receive)

    # 清除发送窗口
    self.s3__clear_button.clicked.connect(self.send_data_clear)

    # 清除接收窗口
    self.s2__clear_button.clicked.connect(self.receive_data_clear)

  # 串口检测
  def port_check(self):
    # 检测所有存在的串口,将信息存储在字典中
    self.Com_Dict = {}
    port_list = list(serial.tools.list_ports.comports())
    self.s1__box_2.clear()
    for port in port_list:
      self.Com_Dict["%s" % port[0]] = "%s" % port[1]
      self.s1__box_2.addItem(port[0])
    if len(self.Com_Dict) == 0:
      self.state_label.setText(" 无串口")

  # 串口信息
  def port_imf(self):
    # 显示选定的串口的详细信息
    imf_s = self.s1__box_2.currentText()
    if imf_s != "":
      self.state_label.setText(self.Com_Dict[self.s1__box_2.currentText()])

  # 打开串口
  def port_open(self):
    self.ser.port = self.s1__box_2.currentText()
    self.ser.baudrate = int(self.s1__box_3.currentText())
    self.ser.bytesize = int(self.s1__box_4.currentText())
    self.ser.stopbits = int(self.s1__box_6.currentText())
    self.ser.parity = self.s1__box_5.currentText()

    try:
      self.ser.open()
    except:
      QMessageBox.critical(self, "Port Error", "此串口不能被打开!")
      return None

    # 打开串口接收定时器,周期为2ms
    self.timer.start(2)

    if self.ser.isOpen():
      self.open_button.setEnabled(False)
      self.close_button.setEnabled(True)
      self.formGroupBox1.setTitle("串口状态(已开启)")

  # 关闭串口
  def port_close(self):
    self.timer.stop()
    self.timer_send.stop()
    try:
      self.ser.close()
    except:
      pass
    self.open_button.setEnabled(True)
    self.close_button.setEnabled(False)
    self.lineEdit_3.setEnabled(True)
    # 接收数据和发送数据数目置零
    self.data_num_received = 0
    self.lineEdit.setText(str(self.data_num_received))
    self.data_num_sended = 0
    self.lineEdit_2.setText(str(self.data_num_sended))
    self.formGroupBox1.setTitle("串口状态(已关闭)")

  # 发送数据
  def data_send(self):
    if self.ser.isOpen():
      input_s = self.s3__send_text.toPlainText()
      if input_s != "":
        # 非空字符串
        if self.hex_send.isChecked():
          # hex发送
          input_s = input_s.strip()
          send_list = []
          while input_s != '':
            try:
              num = int(input_s[0:2], 16)
            except ValueError:
              QMessageBox.critical(self, 'wrong data', '请输入十六进制数据,以空格分开!')
              return None
            input_s = input_s[2:].strip()
            send_list.append(num)
          input_s = bytes(send_list)
        else:
          # ascii发送
          input_s = (input_s + '\r\n').encode('utf-8')

        num = self.ser.write(input_s)
        self.data_num_sended += num
        self.lineEdit_2.setText(str(self.data_num_sended))
    else:
      pass

  # 接收数据
  def data_receive(self):
    try:
      num = self.ser.inWaiting()
    except:
      self.port_close()
      return None
    if num > 0:
      data = self.ser.read(num)
      num = len(data)
      # hex显示
      if self.hex_receive.checkState():
        out_s = ''
        for i in range(0, len(data)):
          out_s = out_s + '{:02X}'.format(data[i]) + ' '
        self.s2__receive_text.insertPlainText(out_s)
      else:
        # 串口接收到的字符串为b'123',要转化成unicode字符串才能输出到窗口中去
        self.s2__receive_text.insertPlainText(data.decode('iso-8859-1'))

      # 统计接收字符的数量
      self.data_num_received += num
      self.lineEdit.setText(str(self.data_num_received))

      # 获取到text光标
      textCursor = self.s2__receive_text.textCursor()
      # 滚动到底部
      textCursor.movePosition(textCursor.End)
      # 设置光标到text中去
      self.s2__receive_text.setTextCursor(textCursor)
    else:
      pass

  # 定时发送数据
  def data_send_timer(self):
    if self.timer_send_cb.isChecked():
      self.timer_send.start(int(self.lineEdit_3.text()))
      self.lineEdit_3.setEnabled(False)
    else:
      self.timer_send.stop()
      self.lineEdit_3.setEnabled(True)

  # 清除显示
  def send_data_clear(self):
    self.s3__send_text.setText("")

  def receive_data_clear(self):
    self.s2__receive_text.setText("")

if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  myshow = Pyqt5_Serial()
  myshow.show()
  sys.exit(app.exec_())

ui_demo_1.py

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

# Form implementation generated from reading ui file 'demo_1.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(707, 458)
    self.formGroupBox = QtWidgets.QGroupBox(Form)
    self.formGroupBox.setGeometry(QtCore.QRect(20, 20, 167, 301))
    self.formGroupBox.setObjectName("formGroupBox")
    self.formLayout = QtWidgets.QFormLayout(self.formGroupBox)
    self.formLayout.setContentsMargins(10, 10, 10, 10)
    self.formLayout.setSpacing(10)
    self.formLayout.setObjectName("formLayout")
    self.s1__lb_1 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_1.setObjectName("s1__lb_1")
    self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.s1__lb_1)
    self.s1__box_1 = QtWidgets.QPushButton(self.formGroupBox)
    self.s1__box_1.setAutoRepeatInterval(100)
    self.s1__box_1.setDefault(True)
    self.s1__box_1.setObjectName("s1__box_1")
    self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.s1__box_1)
    self.s1__lb_2 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_2.setObjectName("s1__lb_2")
    self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.s1__lb_2)
    self.s1__box_2 = QtWidgets.QComboBox(self.formGroupBox)
    self.s1__box_2.setObjectName("s1__box_2")
    self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.s1__box_2)
    self.s1__lb_3 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_3.setObjectName("s1__lb_3")
    self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.s1__lb_3)
    self.s1__box_3 = QtWidgets.QComboBox(self.formGroupBox)
    self.s1__box_3.setObjectName("s1__box_3")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.s1__box_3.addItem("")
    self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.s1__box_3)
    self.s1__lb_4 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_4.setObjectName("s1__lb_4")
    self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.s1__lb_4)
    self.s1__box_4 = QtWidgets.QComboBox(self.formGroupBox)
    self.s1__box_4.setObjectName("s1__box_4")
    self.s1__box_4.addItem("")
    self.s1__box_4.addItem("")
    self.s1__box_4.addItem("")
    self.s1__box_4.addItem("")
    self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.s1__box_4)
    self.s1__lb_5 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_5.setObjectName("s1__lb_5")
    self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.s1__lb_5)
    self.s1__box_5 = QtWidgets.QComboBox(self.formGroupBox)
    self.s1__box_5.setObjectName("s1__box_5")
    self.s1__box_5.addItem("")
    self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.s1__box_5)
    self.open_button = QtWidgets.QPushButton(self.formGroupBox)
    self.open_button.setObjectName("open_button")
    self.formLayout.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.open_button)
    self.close_button = QtWidgets.QPushButton(self.formGroupBox)
    self.close_button.setObjectName("close_button")
    self.formLayout.setWidget(8, QtWidgets.QFormLayout.SpanningRole, self.close_button)
    self.s1__lb_6 = QtWidgets.QLabel(self.formGroupBox)
    self.s1__lb_6.setObjectName("s1__lb_6")
    self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.s1__lb_6)
    self.s1__box_6 = QtWidgets.QComboBox(self.formGroupBox)
    self.s1__box_6.setObjectName("s1__box_6")
    self.s1__box_6.addItem("")
    self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.s1__box_6)
    self.state_label = QtWidgets.QLabel(self.formGroupBox)
    self.state_label.setText("")
    self.state_label.setTextFormat(QtCore.Qt.AutoText)
    self.state_label.setScaledContents(True)
    self.state_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
    self.state_label.setObjectName("state_label")
    self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.state_label)
    self.verticalGroupBox = QtWidgets.QGroupBox(Form)
    self.verticalGroupBox.setGeometry(QtCore.QRect(210, 20, 401, 241))
    self.verticalGroupBox.setObjectName("verticalGroupBox")
    self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalGroupBox)
    self.verticalLayout.setContentsMargins(10, 10, 10, 10)
    self.verticalLayout.setObjectName("verticalLayout")
    self.s2__receive_text = QtWidgets.QTextBrowser(self.verticalGroupBox)
    self.s2__receive_text.setObjectName("s2__receive_text")
    self.verticalLayout.addWidget(self.s2__receive_text)
    self.verticalGroupBox_2 = QtWidgets.QGroupBox(Form)
    self.verticalGroupBox_2.setGeometry(QtCore.QRect(210, 280, 401, 101))
    self.verticalGroupBox_2.setObjectName("verticalGroupBox_2")
    self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalGroupBox_2)
    self.verticalLayout_2.setContentsMargins(10, 10, 10, 10)
    self.verticalLayout_2.setObjectName("verticalLayout_2")
    self.s3__send_text = QtWidgets.QTextEdit(self.verticalGroupBox_2)
    self.s3__send_text.setObjectName("s3__send_text")
    self.verticalLayout_2.addWidget(self.s3__send_text)
    self.s3__send_button = QtWidgets.QPushButton(Form)
    self.s3__send_button.setGeometry(QtCore.QRect(620, 310, 61, 31))
    self.s3__send_button.setObjectName("s3__send_button")
    self.s3__clear_button = QtWidgets.QPushButton(Form)
    self.s3__clear_button.setGeometry(QtCore.QRect(620, 350, 61, 31))
    self.s3__clear_button.setObjectName("s3__clear_button")
    self.formGroupBox1 = QtWidgets.QGroupBox(Form)
    self.formGroupBox1.setGeometry(QtCore.QRect(20, 340, 171, 101))
    self.formGroupBox1.setObjectName("formGroupBox1")
    self.formLayout_2 = QtWidgets.QFormLayout(self.formGroupBox1)
    self.formLayout_2.setContentsMargins(10, 10, 10, 10)
    self.formLayout_2.setSpacing(10)
    self.formLayout_2.setObjectName("formLayout_2")
    self.label = QtWidgets.QLabel(self.formGroupBox1)
    self.label.setObjectName("label")
    self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
    self.label_2 = QtWidgets.QLabel(self.formGroupBox1)
    self.label_2.setObjectName("label_2")
    self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
    self.lineEdit = QtWidgets.QLineEdit(self.formGroupBox1)
    self.lineEdit.setObjectName("lineEdit")
    self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
    self.lineEdit_2 = QtWidgets.QLineEdit(self.formGroupBox1)
    self.lineEdit_2.setObjectName("lineEdit_2")
    self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
    self.hex_send = QtWidgets.QCheckBox(Form)
    self.hex_send.setGeometry(QtCore.QRect(620, 280, 71, 16))
    self.hex_send.setObjectName("hex_send")
    self.hex_receive = QtWidgets.QCheckBox(Form)
    self.hex_receive.setGeometry(QtCore.QRect(620, 40, 71, 16))
    self.hex_receive.setObjectName("hex_receive")
    self.s2__clear_button = QtWidgets.QPushButton(Form)
    self.s2__clear_button.setGeometry(QtCore.QRect(620, 80, 61, 31))
    self.s2__clear_button.setObjectName("s2__clear_button")
    self.timer_send_cb = QtWidgets.QCheckBox(Form)
    self.timer_send_cb.setGeometry(QtCore.QRect(260, 390, 71, 16))
    self.timer_send_cb.setObjectName("timer_send_cb")
    self.lineEdit_3 = QtWidgets.QLineEdit(Form)
    self.lineEdit_3.setGeometry(QtCore.QRect(350, 390, 61, 20))
    self.lineEdit_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
    self.lineEdit_3.setObjectName("lineEdit_3")
    self.dw = QtWidgets.QLabel(Form)
    self.dw.setGeometry(QtCore.QRect(420, 390, 54, 20))
    self.dw.setObjectName("dw")
    self.verticalGroupBox.raise_()
    self.verticalGroupBox_2.raise_()
    self.formGroupBox.raise_()
    self.s3__send_button.raise_()
    self.s3__clear_button.raise_()
    self.formGroupBox.raise_()
    self.hex_send.raise_()
    self.hex_receive.raise_()
    self.s2__clear_button.raise_()
    self.timer_send_cb.raise_()
    self.lineEdit_3.raise_()
    self.dw.raise_()

    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)

  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "Form"))
    self.formGroupBox.setTitle(_translate("Form", "串口设置"))
    self.s1__lb_1.setText(_translate("Form", "串口检测:"))
    self.s1__box_1.setText(_translate("Form", "检测串口"))
    self.s1__lb_2.setText(_translate("Form", "串口选择:"))
    self.s1__lb_3.setText(_translate("Form", "波特率:"))
    self.s1__box_3.setItemText(0, _translate("Form", "115200"))
    self.s1__box_3.setItemText(1, _translate("Form", "2400"))
    self.s1__box_3.setItemText(2, _translate("Form", "4800"))
    self.s1__box_3.setItemText(3, _translate("Form", "9600"))
    self.s1__box_3.setItemText(4, _translate("Form", "14400"))
    self.s1__box_3.setItemText(5, _translate("Form", "19200"))
    self.s1__box_3.setItemText(6, _translate("Form", "38400"))
    self.s1__box_3.setItemText(7, _translate("Form", "57600"))
    self.s1__box_3.setItemText(8, _translate("Form", "76800"))
    self.s1__box_3.setItemText(9, _translate("Form", "12800"))
    self.s1__box_3.setItemText(10, _translate("Form", "230400"))
    self.s1__box_3.setItemText(11, _translate("Form", "460800"))
    self.s1__lb_4.setText(_translate("Form", "数据位:"))
    self.s1__box_4.setItemText(0, _translate("Form", "8"))
    self.s1__box_4.setItemText(1, _translate("Form", "7"))
    self.s1__box_4.setItemText(2, _translate("Form", "6"))
    self.s1__box_4.setItemText(3, _translate("Form", "5"))
    self.s1__lb_5.setText(_translate("Form", "校验位:"))
    self.s1__box_5.setItemText(0, _translate("Form", "N"))
    self.open_button.setText(_translate("Form", "打开串口"))
    self.close_button.setText(_translate("Form", "关闭串口"))
    self.s1__lb_6.setText(_translate("Form", "停止位:"))
    self.s1__box_6.setItemText(0, _translate("Form", "1"))
    self.verticalGroupBox.setTitle(_translate("Form", "接受区"))
    self.verticalGroupBox_2.setTitle(_translate("Form", "发送区"))
    self.s3__send_text.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">123456</p></body></html>"))
    self.s3__send_button.setText(_translate("Form", "发送"))
    self.s3__clear_button.setText(_translate("Form", "清除"))
    self.formGroupBox1.setTitle(_translate("Form", "串口状态"))
    self.label.setText(_translate("Form", "已接收:"))
    self.label_2.setText(_translate("Form", "已发送:"))
    self.hex_send.setText(_translate("Form", "Hex发送"))
    self.hex_receive.setText(_translate("Form", "Hex接收"))
    self.s2__clear_button.setText(_translate("Form", "清除"))
    self.timer_send_cb.setText(_translate("Form", "定时发送"))
    self.lineEdit_3.setText(_translate("Form", "1000"))
    self.dw.setText(_translate("Form", "ms/次"))

以上这篇使用Python3+PyQT5+Pyserial 实现简单的串口工具方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python多进程通信Queue、Pipe、Value、Array实例

    queue和pipe的区别: pipe用来在两个进程间通信.queue用来在多个进程间实现通信. 此两种方法为所有系统多进程通信的基本方法,几乎所有的语言都支持此两种方法. 1)Queue & JoinableQueue queue用来在进程间传递消息,任何可以pickle-able的对象都可以在加入到queue. multiprocessing.JoinableQueue 是 Queue的子类,增加了task_done()和join()方法. task_done()用来告诉queue一个tas

  • Python网络编程使用select实现socket全双工异步通信功能示例

    本文实例讲述了Python网络编程使用select实现socket全双工异步通信功能.分享给大家供大家参考,具体如下: 在前面一篇<Python网络编程之TCP套接字简单用法>中,我们实现了tcp客户端与服务器的通信,但是功能十分局限,发送消息与接收消息不能同时进行. 接下来我将通过select这个模块,来实现全双工通信(随时可以接收信息以及发送信息),当然,用多线程也可以完成,这是后话. 那么,select为何物? select  -在单线程网络服务中器程序中,管理多个套接字连接 selec

  • Python使用pyserial进行串口通信的实例

    安装pyserial pip install pyserial 查看可用的端口 # coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.comports()) if len(plist) <= 0: print("没有发现端口!") else: plist_0 = list(plist[0]) serialName = plist_0[0] serialFd = seri

  • Python socket实现的简单通信功能示例

    本文实例讲述了Python socket实现的简单通信功能.分享给大家供大家参考,具体如下: 套接字(socket)是计算机网络数据结构,在任何类型的通信开始之前,网络应用程序必须创建套接字,可以将其比作电话的插孔,没有它将无法进行通信 常用的地址家族 AF_UNIX:基于文件,实现同一主机不同进程之间的通信 AF_INET:基于网络,适用于IPv4 AF_INET6:基于网络,使用于IPv6 常见的连接类型 SOCK_STREAM:即TCP/IP.面向连接的套接字,通信之前必须建立可靠的连接.

  • python多进程实现进程间通信实例

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换.multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queue.Pipe.Lock等组件. multiprocessing.Queue() 以Queue为例,

  • Python中的FTP通信模块ftplib的用法整理

    Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件. FTP的工作流程及基本操作可参考协议RFC959. ftp登陆连接 from ftplib import FTP #加载ftp模块 ftp=FTP() #设置变量 ftp.set_debuglevel(2) #打开调试级别2,显示详细信息 ftp.connect("IP","port") #连接的ftp sever和端口 ftp.login(&q

  • Python实现串口通信(pyserial)过程解析

    pyserial模块封装了对串口的访问,兼容各种平台. 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser = serial.Serial('com1', 9600, timeout=1) 所有参数 ser = serial.Serial( port=None, # number of device, numbering starts at # zero. if everything fails, the user # can specif

  • Python通过websocket与js客户端通信示例分析

    具体的 websocket 介绍可见 http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用 Python 与前端 js 进行通信. websocket 使用 HTTP 协议完成握手之后,不通过 HTTP 直接进行 websocket 通信. 于是,使用 websocket 大致两个步骤:使用 HTTP 握手,通信. js 处理 websocket 要使用 ws 模块: Python 处理则使用 socket 模块建立 TCP 连接即可,比一般的 soc

  • 使用Python3+PyQT5+Pyserial 实现简单的串口工具方法

    练手项目,先上图 先实现一个简单的串口工具,为之后的上位机做准备 代码如下: github 下载地址 pyserial_demo.py import sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtCore import QTimer from ui_demo_1 import Ui_F

  • python3+pyqt5+itchat微信定时发送消息的方法

    编这个程序是想过节过年,一些重要的纪念日,给亲戚好友发祝福之类的,但要凌晨0点才显得比较有诚意,可我又比较贪睡,常常忘了,所以就有了编个微信定时发送消息小程序. 运行环境: python 3.x,不支持python2 准备工作 由于我用到了微信的接口,所以引入itchat 界面用了pyqt5 安装命令如下: pip install PyQt5 pip install itchat 代码部分 # -*- coding: utf-8 -*- # @Time : 2018/9/25 11:06 # @

  • python3+PyQt5 实现Rich文本的行编辑方法

    本文通过Python3+PyQt5实现<python Qt Gui 快速编程>这本书13章程序Rich文本的行编辑,可以通过鼠标右键选择对文本进行加粗,斜体,下划线,删除线,上标,下标等编辑. #!/usr/bin/env python3 import platform import sys import html from PyQt5.QtCore import QSize, Qt,pyqtSignal from PyQt5.QtGui import QColor, QFont,QFontM

  • python实现一个简单的ping工具方法

    继上一篇计算checksum校验和,本章通过socket套接字,struct字节打包成二进制,select返回套接字的文件描述符的结合,实现一个简单的ping工具. #!/usr/bin/python3.6.4 #!coding:utf-8 __author__ = 'Rosefinch' __date__ = '2018/5/31 22:27' import time import struct import socket import select import sys def chesks

  • Python3简单实现串口通信的方法

    如下所示: import serial import sys import os import time import re def wait_for_cmd_OK():     while True:         line = ser.readline()         try:             print(line.decode('utf-8'),end='')         except:             pass         if ( re.search(b'

  • python3+PyQt5实现自定义窗口部件Counters

    本文通过Python3+PyQt5实现自定义部件–Counters自定 窗口部件.这个窗口是3*3的网格.本文有两个例子如下: /home/yrd/eric_workspace/chap11/counters.py. /home/yrd/eric_workspace/chap11/counters_dnd.py 第二个例子在第一个例子的基础上实现能通过鼠标拖拽球到不同的网格中. /home/yrd/eric_workspace/chap11/counters.py #!/usr/bin/env

  • python3+PyQt5+Qt Designer实现扩展对话框

    本文是对<Python Qt GUI快速编程>的第9章的扩展对话框例子Find and replace用Python3+PyQt5+Qt Designer进行改写. 第一部分无借用Qt Designer,完全用代码实现. 第二部分则借用Qt Designer,快速实现. 第一部分: import sys from PyQt5.QtCore import Qt,pyqtSignal from PyQt5.QtWidgets import (QApplication, QCheckBox, QDi

  • python3+PyQt5+Qt Designer实现堆叠窗口部件

    本文是对<Python Qt GUI快速编程>的第9章的堆叠窗口例子Vehicle Rental用Python3+PyQt5+Qt Designer进行改写. 第一部分无借用Qt Designer,完全用代码实现. 第二部分则借用Qt Designer,快速实现. 第一部分: import sys from PyQt5.QtCore import (Qt) from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog, QDialo

  • python3+PyQt5重新实现QT事件处理程序

    本文是对<Python Qt GUI快速编程>的第10章的例子events用Python3+PyQt5进行改写,涉及到重新实现QWidget的事件处理程序.本例子涉及到上下文菜单,鼠标事件,键盘事件,可作为重新实现事件处理程序的参考. 注:在创建上下文菜单最简单的方式使用Qwidget.addAction()把动作添加到窗口部件中,再把窗口部件的上下文菜单策略设置为Qt.ActionsContextMenu即可,但是如果像本例子一样要根据不同的状态来提供不同的选项,则要重新实现上下文菜单事件处

  • python3+PyQt5重新实现自定义数据拖放处理

    本文分成两部分,第一部分通过python3+PyQt5实现自定义数据的拖放操作.第二部分则对第一部分的程序进行修改,增加拖放操作时,菜单提示是否移动或拷贝,还有可以通过ctrl键盘来设置移动过程中拷贝源而非会将源删除. 自定义数据MIME数据类型QMimeData,MIME是一种用于处理具有多个组成部分的自定义数据的标准化格式.MIME数据由一个数据类型和一个子类型构成–例如,text/plain,text/html,image/png,要处理自定义MIME数据,就必须要选用一种自定义数据类型和

随机推荐