Giter Site home page Giter Site logo

pyqt5's Introduction

《PyQt5快速开发与实战》

为什么要编写本书?

PyQt近年来发展很快,从最初的1998年的PyQt0.1,到PyQt1、PyQt2、PyQt3、PyQt4以及最新的PyQt5.9(截止到2017年8月9日),然而非常不幸的是,市面上并没有一本真正指导新手学习PyQt5的教材,网络上针对PyQt5的学习案例的知识结构也都非常零碎,形成不了一个学习PyQt5的系统化框架。因此对于新手来说,想要快速接受PyQt5系统性的训练是一个非常困难的事情,2位笔者在最初学习PyQt5的时候也是吃尽了苦头,查阅了PyQt5与Qt5的大量官方文献资料并结合几年的实战应用之后,才敢说在PyQt5方面稍微有所建树,能够开发出自己想要的程序。

编程是一个孰能生巧的活儿,但是如果未来不使用这项技术,那么再过几年说不定就完全忘记PyQt5是如何使用的了,如果是这样的话就会给自己留下一些遗憾。本书考虑到现在个人还有一些额外的时间与精力,考虑到目前市面上还没有一本关于PyQt5使用的教材,经过两位作者近一年的不懈努力,于是才有本书现在的结果。

本书的结构

使用的是最新版本的PyQt5.9,详细讲解了PyQt5的各个知识点,包含从入门到实战的所有例子。

本书共包含11个章节,这些章节基本包含了笔者在使用PyQt中遇到的绝大多数技术以及一些简单的应用。本书虽然有11个章节,但是有些章节是具有独立性的,读者可以针对自己的实际情况选择性阅读。

本书第一章介绍了PyQt的入门知识,讲述了PyQt的安装配置以及Eric6这个IDE的简单使用方法。对于对PyQt已经有一定基础的朋友可以略去这一章。

本书第二章简单介绍了Python的基本语法,本章针对一些没有接触过python的读者,对于Python已经有一些基础的朋友可以略去这一章。

本书第三章介绍Qt Designer的使用方法,Qt Designer是一个PyQt的可视化界面编辑程序,他的作用是帮助我们快速开发出界面文件,我们可以通过其他方式把界面文件转化成python代码文件。对于不懂太多PyQt知识的读者来说,本章可以让你快速入门,同时,本章也是让自己的PyQt技术快速进步的最重要的章节。

本书第四章介绍了PyQt的基本控件的使用方法,如果读者时间并不充裕,只对部分控件感兴趣,可以选取相应的小节进行阅读。

本书第五章介绍了PyQt的高级控件的使用方法,如果读者对PyQt的表格、树、多文本页面、数据库、多线程等等感兴趣,可以在这一章中选择相应的小节阅读。

本书第六章重新介绍了PyQt的布局管理的使用(之前在第3章通过Qt Designer的使用方法中已经介绍,第3章是通过Qt Designer这个代码生成器进行介绍,这里通过手工敲打代码的方法介绍)。由于布局管理非常重要,值得我们以一个新的章节介绍,如果读者对纯代码实现布局管理器感兴趣可以参考这一章,如果对代码生成器Qt Designer的布局管理器感兴趣也可以忽略这个章节。实际上两种方法并没有本质的区别。

本书第七章介绍了PyQt信号与槽的应用,信号与槽是PyQt的核心,想要掌握PyQt的高级玩法的朋友可以仔细阅读这个章节。

本书第八章介绍了PyQt的图形特效,如果读者对PyQt绘图,背景着色等感兴趣,可以阅读这个章节。

本书第九章介绍了PyQt的扩展应用,如果你想知道如何把Python的一些非常流行的模块如pyinstaller、pandas、matplotlib、pyqtgraph、plotly等与PyQt结合,可以从这一章节中选择性的阅读。

本书第十章通过几个例子介绍PyQt的实战应用,想要简单了解一些简单的程序是如何开发的朋友可以选择性的阅读这个章节。

本书第十一章介绍PyQt在金融领域中的应用,是本书的另一个作者孙洋在金融公司工作过程中积累的一些实战性较高的案例,向读者展示PyQt如何应用到投资研究系统、量化投资、以及金融工具开发,读者可以根据自己的需求选择性阅读。

本书的运行环境

笔者在业余时间为本书封装了可以运行本书所有程序的绿色版的PyQt5环境,不会影响自己系统的默认环境,适合对python刚入门的新手或不想为本书重新折腾一个安装环境的老手。下载地址见网盘链接:http://pan.baidu.com/s/1i4Pp5VB 密码:u83w

注意:

  • 下载后需要解压到D盘根目录(必须是D盘,而且是根目录,否则eric不能运行)。
  • 这个安装环境没有配置jupyter qtconsole,jupyter notebook,spyder,但是配置好了eric,读者可以使用eric跑通所有程序。
  • eric打开的路径:d:\WinPyQt5.9-32bit-3.5.3.1\python-3.5.3\Scripts\eric6.bat

购买通道

《PyQt5快速开发与实战》已经在京东商城上线了,欢迎大家购买。

亲爱的读者们,现在可以在京东商城购买《PyQt5快速开发与实战》了。店铺地址是: https://item.jd.com/12194083.html

  • 2017年8月24日已经通过稿件一排。
  • 2017年8月28日提交稿件二排。
  • 2017年9月8日已经通过稿件二排,正式定稿。
  • 2017年9月25日出版社完成第一批图书的印刷。
  • 2017年10月上旬正式在各大电商平台发售。

联系作者

如果读者有任何问题,请发送电子邮件联系2位笔者(王硕,孙洋洋),邮箱为[email protected],邮件主题为“PyQt5代码”。也可以直接加入QQ的PyQt5开发高级群(592588163) 联系笔者,2位笔者白天都在群里。

路漫漫其修远兮,吾将上下而求索。在读者的不断求索中,能够与本书相遇也是一种缘分,如果读者能够从本书中获取自己想要的东西,那就是对笔者最大的欣慰。最后,提前预祝读者学习上轻松愉快、工作上更进一步、生活上幸福美满,学有所成。

pyqt5's People

Contributors

cxinping avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pyqt5's Issues

书本错字

4.2.2 名称是常用的几何机构
应该是
常用的几何结构

书中案例8-3(双缓存绘图)代码疑似有误,QPixmap应该用深拷贝吧?

书中案例8-3(双缓存绘图)代码看意图是否以下此处需改为 深拷贝:

PyQt5/Chapter08/qt08_winDraw03.py

目前为:
# 将以前pix中的内容复制到tempPix中,保证以前的内容不消失
self.tempPix = self.pix

是否应改为 :
# 将以前pix中的内容复制到tempPix中,保证以前的内容不消失
self.tempPix = self.pix.copy(self.pix.rect())

否则按目前的形式感觉导致 tempPix 和 pix 引用(操作)的其实是同一块内存。

pyqt5版本更新之后刷新速度变慢了10倍

pyqt版本从5.11.3 更新到 PyQt5-5.14.0之后如下代码相同的刷新数据,更新速度变慢了10倍
版本 5.14
2019-12-30 10:36:03.627884
2019-12-30 10:36:03.828350
版本 5.11
2019-12-30 10:38:07.485788
2019-12-30 10:38:07.512682
不知道出了什么情况
`

主程序

class QtGuiThreadBackend(QThread):
"""更新数据类"""
update = pyqtSignal(dict)

def __init__(self, log, share_dict, freq=0.5, parent=None):
    super().__init__(parent)
    self.log = log

    # 刷新频率
    self.freq = freq
    # 通讯端口
    self.share_dict = share_dict

def run(self):
    while True:
        display_dict = self.share_dict.copy()
        self.update.emit(display_dict)
        self.log.info("update gui display data!")
        sleep(self.freq)

`

`
from datetime import datetime
from time import sleep

from PyQt5.QtCore import pyqtSignal, QThread, QCoreApplication
from .ConsoleETFOptionSingle import ModQtGuiConsole as RiskConsole
from ..iGuiDesigner.RiskMain import Ui_MainWindow

class QtGuiFrontend(Ui_MainWindow):
def init(self, main_windows, share_dict, map_list):
self.setupUi(main_windows)

    self.share_dict = share_dict
    self.risk_console_1 = self.init_risk_console_1("gui_console_dict_rv1", self.share_dict, map_list)

    # 50ETF 510050 标的切换
    self.radioButtonA1.setChecked(True)
    self.radioButtonA3.setChecked(True)
    self.radioButtonA5.setChecked(True)
    self.radioButtonA7.setChecked(True)
    self.pushButtonA1.clicked.connect(self.run_pushButtonA1)
    self.run_pushButtonA1()

    # 300ETF 510300 标的切换
    self.radioButtonB1.setChecked(True)
    self.radioButtonB3.setChecked(True)
    self.radioButtonB5.setChecked(True)
    self.radioButtonB7.setChecked(True)
    self.pushButtonB1.clicked.connect(self.run_pushButtonB1)
    self.run_pushButtonB1()

    # 300ETF IO 标的切换
    self.radioButtonC1.setChecked(True)
    self.radioButtonC3.setChecked(True)
    self.radioButtonC5.setChecked(True)
    self.radioButtonC7.setChecked(True)
    self.radioButtonC9.setChecked(True)
    self.radioButtonC11.setChecked(True)
    self.pushButtonC1.clicked.connect(self.run_pushButtonC1)
    self.run_pushButtonC1()

    # 300ETF IO 标的切换
    self.radioButtonD1.setChecked(True)
    self.radioButtonD3.setChecked(True)
    self.radioButtonD5.setChecked(True)
    self.radioButtonD7.setChecked(True)
    self.pushButtonD1.clicked.connect(self.run_pushButtonD1)
    self.run_pushButtonD1()

def init_risk_console_1(self, name, share_dict, map_list):
    risk_console = RiskConsole(name, share_dict, map_list)
    risk_console.setupUi(self.tab)

    risk_console.init_pos_table()
    risk_console.init_future_table()
    risk_console.init_button()
    risk_console.init_greeks_table()
    return risk_console

def set_ui_title(self, MainWindow, title_name):
    _translate = QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", title_name))

def run_pushButtonA1(self):
    """
    标的切换

    :return:
    """
    pcp_flag = [True, True, True, True]

    if self.radioButtonA1.isChecked():
        pcp_flag[0] = True
    else:
        pcp_flag[0] = False

    if self.radioButtonA3.isChecked():
        pcp_flag[1] = True
    else:
        pcp_flag[1] = False

    if self.radioButtonA5.isChecked():
        pcp_flag[2] = True
    else:
        pcp_flag[2] = False

    if self.radioButtonA7.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    self.risk_console_1.t1_dict["pcp_flag"] = pcp_flag
    self.share_dict["gui_console_dict_rv1"] = self.risk_console_1.share_dict

    self.statusbar.showMessage('Modify Underlying Type {}'.format(
        datetime.now().strftime("%Y-%m-%d %H:%M%S %f")))

def run_pushButtonB1(self):
    """
    标的切换

    :return:
    """
    pcp_flag = [True, True, True, True]

    if self.radioButtonB1.isChecked():
        pcp_flag[0] = True
    else:
        pcp_flag[0] = False

    if self.radioButtonB3.isChecked():
        pcp_flag[1] = True
    else:
        pcp_flag[1] = False

    if self.radioButtonB5.isChecked():
        pcp_flag[2] = True
    else:
        pcp_flag[2] = False

    if self.radioButtonB7.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    self.risk_console_1.t2_dict["pcp_flag"] = pcp_flag
    self.share_dict["gui_console_dict_rv1"] = self.risk_console_1.share_dict

    self.statusbar.showMessage('Modify Underlying Type {}'.format(
        datetime.now().strftime("%Y-%m-%d %H:%M%S %f")))

def run_pushButtonC1(self):
    """
    标的切换

    :return:
    """
    pcp_flag = [True, True, True, True, True, True]

    if self.radioButtonC1.isChecked():
        pcp_flag[0] = True
    else:
        pcp_flag[0] = False

    if self.radioButtonC3.isChecked():
        pcp_flag[1] = True
    else:
        pcp_flag[1] = False

    if self.radioButtonC5.isChecked():
        pcp_flag[2] = True
    else:
        pcp_flag[2] = False

    if self.radioButtonC7.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    if self.radioButtonC9.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    if self.radioButtonC11.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    self.risk_console_1.t3_dict["pcp_flag"] = pcp_flag
    self.statusbar.showMessage('Modify Underlying Type {}'.format(
        datetime.now().strftime("%Y-%m-%d %H:%M%S %f")))

def run_pushButtonD1(self):
    """
    标的切换

    :return:
    """
    pcp_flag = [True, True, True, True]

    if self.radioButtonD1.isChecked():
        pcp_flag[0] = True
    else:
        pcp_flag[0] = False

    if self.radioButtonD3.isChecked():
        pcp_flag[1] = True
    else:
        pcp_flag[1] = False

    if self.radioButtonD5.isChecked():
        pcp_flag[2] = True
    else:
        pcp_flag[2] = False

    if self.radioButtonD7.isChecked():
        pcp_flag[3] = True
    else:
        pcp_flag[3] = False

    self.risk_console_1.t4_dict["pcp_flag"] = pcp_flag
    self.statusbar.showMessage('Modify Underlying Type {}'.format(
        datetime.now().strftime("%Y-%m-%d %H:%M%S %f")))

"""后台更新程序"""

def update_item_data(self, display_dict):
    risk_data_510050_rv1 = display_dict["risk_data_510050_rv1"]
    if risk_data_510050_rv1 is not None:
        self.risk_console_1.update_t1(*risk_data_510050_rv1)
    print(datetime.now())

    risk_data_510300_rv1 = display_dict["risk_data_510300_rv1"]
    if risk_data_510300_rv1 is not None:
        self.risk_console_1.update_t2(*risk_data_510300_rv1)
    print(datetime.now())

    # """中金所 沪深300期权"""
    # risk_data_io_rv1 = display_dict["risk_data_io_rv1"]
    # if risk_data_io_rv1 is not None:
    #     self.risk_console_1.update_t3(*risk_data_io_rv1)
    #
    # # 深交所 沪深300 ETF期权
    # risk_data_159919_rv1 = display_dict["risk_data_159919_rv1"]
    # if risk_data_159919_rv1 is not None:
    #     self.risk_console_1.update_t4(*risk_data_159919_rv1)

    self.statusbar.showMessage('update-{}'.format(
        datetime.now().strftime("%Y-%m-%d %H:%M:%S %f")))

主程序

class QtGuiThreadBackend(QThread):
"""更新数据类"""
update = pyqtSignal(dict)

def __init__(self, log, share_dict, freq=0.5, parent=None):
    super().__init__(parent)
    self.log = log

    # 刷新频率
    self.freq = freq
    # 通讯端口
    self.share_dict = share_dict

def run(self):
    while True:
        display_dict = self.share_dict.copy()
        self.update.emit(display_dict)
        self.log.info("update gui display data!")
        sleep(self.freq)

`

eric6窗体文件编译失败

在win10 64位系统上,使用仓库中百度云分享压缩包的开发环境。
版本 Windows 10 专业版
版本号 21H2
安装日期 ‎2021/‎10/‎27
操作系统内部版本 19044.1620
体验 Windows Feature Experience Pack 120.2212.4170.0

eric6

采用方案绕开:
新建一个pyuic_Scanner_main.bat文件,内容如下Scanner_main.ui为要编译的窗体的名字

@D:/WinPyQt5.9-32bit-3.5.3.1/python-3.5.3\python.exe -m PyQt5.uic.pyuic -o Scanner_main.py Scanner_main.ui

双击bat文件,运行,得到Scanner_main.py 这一窗体编译结果。

8-1 WinDraw01, 右键和中键也可以画图, 建议修改条件

def mouseMoveEvent(self, event):
# 鼠标左键按下的同时移动鼠标
if event.buttons() and Qt.LeftButton :
self.endPoint = event.pos()
#进行重新绘制
self.update()

这个条件 if 的两项在使用中键右键拖动同样触发, 应该要像其他几个判断一样 == 就好了,

安装Eric出错

报错
RuntimeError: the sip module implements API v12.0 to v12.6 but the PyQt5.QtWebEngineWidgets module requires API v12.7

国际化例子不成功

试运行了下appendix和Chapter03的国际化例子,均显示为英文。请问是否是我运行方式有问题?
环境:win10,python3.6

Chapter09的MatplotlibWidget.py文件运行报错

在Chapter09的MatplotlibWidget.py文件运行报错,信息如下: File "C:\Users\bisho\Downloads\Compressed\PyQt5-master\PyQt5-master\Chapter09\MatplotlibWidget.py", line 27, in init self.axes.hold(False) # 每次绘图的时候不保留上一次绘图的结果 AttributeError: 'AxesSubplot' object has no attribute 'hold'。
这是matplotlib的问题吗?请问具体怎么解决?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.