Python3的桌面程序开发利器:Eric6的环境搭建、使用
本文旨在通过一个简单的demo,介绍基于Python3、PyQT5的环境下开发桌面应用程序的一种方案,当然开发Python的桌面应用程序不止是PyQT 这一种方案,还可以使用Python自带的Tkinter 来实现。
本文目录:
1. 安装依赖环境
Eric6官网:http://eric-ide.python-projects.org/
Eric6 依赖的组件必须先安装好,依赖组件列表如下:
依赖:
为了使用 eric6 你应该预先安装好下列组件:
- Python 3.4.0 or better
- Python 2.7.10 or better
- Qt 5.3.0 or better (from The Qt Company)
- Qt 4.8.0 or better (from The Qt Company)
- PyQt 5.3.0 or better (from Riverbank)
- PyQt 4.10.0 or better (from Riverbank)
- QScintilla 2.8.0 or better (from Riverbank)
组件太多,并且他们之间的依赖关系一言不合就出错,这里介绍个比较好的集成环境 Anaconda3 (64-bit) ,用它来安装Pyqt等可以比较省心。
我本机的环境是:
- Win7 64位
- Anaconda 3-5.2.0-Windows-x86_64
- Python 3.6.5
- pip 10.0.1
- Eric6 18.10
- Pyqt 5.9.2
- QScintilla
- PyInstaller 3.5.dev0
其中QScintilla
是通过命令pip3 install QScintilla
安装的。
2. 安装Eric6
依赖环境都搞定后,下载Eric6:
Eric6稳定版官方下载地址:Eric6-18 :点我去下载
由于18.0版本开始没有了汉化包(或者是现在到了18.10版本都还没有出来?),我们可以用17.12里面的中文包来达到汉化的目标。
Eric6-17.12:点我去下载
下载后,把18.10的主程序zip包解压,然后把17.12这个中文语言包解压,覆盖到18.10目录,然后在cmd进入这个18.10主程序包解压目录,执行下面的命令安装:
pyton install.py
安装完成后启动,双击eric6.cmd
文件启动(我的因为是安装了Anaconda3,所以这个cmd文件所在路径为:C:\ProgramData\Anaconda3\Scripts
),如果界面是中文的表示前面的汉化操作成功。
这里有个小问题,双击这个批处理启动的时候,会一闪而过一个黑色的cmd窗口,不能忍,用一个简单的方法搞定… ,给这个文件创建个快捷方式发送到桌面,然后在这个快捷方式上右键属性,在运行方式
那里把【常规窗口
】改为 最小化:
然后点应用-确定,下次双击启动就妥妥的看不到一闪而过的忧伤了…
3. 配置Eric
启动eric6后,界面如下,可以看到中文汉化成功:
首次启动,会自动弹出对配置对话框提示让你配置信息,如果你错过了也没关系,从Eric6的应用程序界面菜单[设置-首选项]
进入,具体配置如下:
从菜单的
插件-插件
存储库进入,安装jedi
插件:
最后配置一下默认工作目录:
4. 创建窗口应用
4.1 创建窗体UI
然后项目文件夹多了以下内容:
回到Eric6界面,左侧的源码Tab页签切换到GUI窗体页签,右键选择
新建窗体
:
然后会引导你选择位置保存这个窗体文件,然后会自动进入QT Designer设计界面:
这个界面,就跟MFC的设计界面差不多,哈哈,左侧鼠标按住
Push Button
按钮控件不放,拖动至中间的窗体中,然后双击这个控件,输入名字:测试按钮
,再添加一个text文本控件,然后设置窗体名字:
4.2 实现代码逻辑
在前面设计好ui界面后,保存代码并关闭QT Designer窗口回到Eric6界面
然后在左侧ui文件上右键选择
编译窗体
生成ui界面组件对应的python代码:
这时会在项目目录生成一个Ui_Test.py 脚本文件,内容如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:\andy\Rep\eric6\Test.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName("dialog")
dialog.resize(400, 343)
dialog.setSizeGripEnabled(True)
# 定义的按钮
self.pushButton = QtWidgets.QPushButton(dialog)
self.pushButton.setGeometry(QtCore.QRect(130, 120, 75, 23))
self.pushButton.setObjectName("pushButton")
# 定义的文本
self.plainTextEdit = QtWidgets.QPlainTextEdit(dialog)
self.plainTextEdit.setGeometry(QtCore.QRect(110, 170, 181, 31))
self.plainTextEdit.setObjectName("plainTextEdit")
self.retranslateUi(dialog)
QtCore.QMetaObject.connectSlotsByName(dialog)
def retranslateUi(self, dialog):
_translate = QtCore.QCoreApplication.translate
dialog.setWindowTitle(_translate("dialog", "测试应用名"))
self.pushButton.setText(_translate("dialog", "测试按钮"))
self.plainTextEdit.setPlainText(_translate("dialog", "点击按钮,改变此处文本"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QDialog()
ui = Ui_dialog()
ui.setupUi(dialog)
dialog.show()
sys.exit(app.exec_())
里面可以看到我们在窗体界面定义的两个控件:按钮、文本显示的对应python类中的变量名为:pushButton
、plainTextEdit
接着在左侧窗体视图的UI文件上右键选择生成对话框代码:
选择对话框上两个控件所需的响应事件后保存:
然后切换到python源码页签可以看到生成了一个py类文件,里面自动生成了刚才在对话框中选择的两个响应事件的代码逻辑:
# -*- coding: utf-8 -*-
"""
Module implementing dialog.
"""
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog
from .Ui_Test import Ui_dialog
class dialog(QDialog, Ui_dialog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(dialog, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
@pyqtSlot()
def on_plainTextEdit_textChanged(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
我们修改下这个类:
- 加上main方法
- 修正引用的ui资源路径:把这里的
from .Ui_Test import Ui_dialog
那个点.去掉,否则会提示找不到这个模块 - 修改按钮响应函数,改变文本控件显示的内容
- 修改文本内容改变响应函数,弹出一个消息提示框
修改完成的内容如下:
# -*- coding: utf-8 -*-
"""
Module implementing dialog.
"""
import sys
#这里我们提供必要的引用。基本控件位于pyqt5.qtwidgets模块中。
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog, QMessageBox
from Ui_Test import Ui_dialog
class dialog(QDialog, Ui_dialog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(dialog, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# 按钮按下,改变label标签的文本内容
self.plainTextEdit.setPlainText(u"按钮触发,我改变了自己!")
@pyqtSlot()
def on_plainTextEdit_textChanged(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
reply = QMessageBox.question(self, '信息', '文本框内容改变了',QMessageBox.Yes)
if __name__ == '__main__':
#每一pyqt5应用程序必须创建一个应用程序对象。sys.argv参数是一个列表,从命令行输入参数。
app = QApplication(sys.argv)
#QWidget部件是pyqt5所有用户界面对象的基类。他为QWidget提供默认构造函数。默认构造函数没有父类。
dialog = dialog()
#resize()方法调整窗口的大小。这离是400px宽248px高
dialog.resize(400, 248)
#设置窗口的标题
dialog.setWindowTitle('我修改了标题')
#显示在屏幕上
dialog.show()
#系统exit()方法确保应用程序干净的退出
#的exec_()方法有下划线。因为执行是一个Python关键词。因此,exec_()代替
sys.exit(app.exec_())
然后点击Eric6应用的菜单:
项目-属性
,配置主脚本为我们这个Test.py
:
最后,通过菜单或者快捷键Ctrl+F2启动我们这个对话框应用:
点击按钮后:
5. 打包py脚本输出exe
5.1 安装pyinstaller
下载pyinstaller源码,源码github地址,有时候用git拉取下来网速很慢,这里可以从csdn下载我上传的最新版本(20181026更新的):点我下载20181026版本源码
然后解压这个源码到某个目录,cmd进入这个解压目录,通过以下命令安装:
python setup.py install
5.2 打包输出exe程序
然后来到我们的.py源码目录,通过以下命令打包成exe文件:
pyinstaller -F -w -i "D:\\xxxxxx\\app.ico" Test.py
基础的命令格式是 pyinstaller [opts] [目标程序.py]
可选的opts有:
-F, –onefile 打包成一个exe文件。
-D, –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。
-c, –console, –nowindowed 使用控制台,无界面(默认)
-w, –windowed, –noconsole 使用窗口,无控制台
-i "D:\\xxxxxx\\app.ico"
这个是更改exe的icon,如果不需要可以去掉。
最后打包出来的exe有35MB大小… 因为把QT核心的dll文件打包在一起了,否则在没有安装python以及PyQt的电脑上无法运行的。
更多内容请查看:pyinstaller官方说明
参考资料:
[1]: Pyqt5官方文档
[2]: Python3官方文档
[3]: 廖雪峰老师的Python3 在线学习手册
[4]: 菜鸟学堂-Python3在线学习
[5]: 其他所有分享过python学习填坑网友的经验
Python3的桌面程序开发利器:Eric6的环境搭建、使用的更多相关文章
- 小程序开发之后台SSM环境搭建(一)
1.新建web项目 打开eclipse,选择file-->New-->Dynamic web Project ,填写项目名字,一直点击next,勾选Generate web.xml dep ...
- c++程序开发利器
c++程序开发利器 vc6visual stdio系列都很好,个人最喜欢vc6,主要原因是快捷,classview和wizardbar功能强大,其他vs秒杀其他的vs windbgWinDbg是在wi ...
- 使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word
现在基于 js 和 web浏览器核心构建的 C/S 程序越来越多,比如微信桌面版(基于 duilib 和 cef).VS CODE(基于electron)等,出于了解的目的,最近学习了 electro ...
- 用python进行桌面程序开发
Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定.这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所 ...
- iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术 ...
- iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleV ...
- [置顶] Django 微信开发(一)——环境搭建
Django 微信开发(一)——环境搭建 随着移动互联网时代的到来,微信——一个改变着我们生活的产品悄悄走近了我们的生活.我们不得不觉得自己很幸运,自己能在这个世界上遇到像QQ.微博.微信这样优秀的产 ...
- 手把手教你君正X2000开发板的OpenHarmony环境搭建
摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...
- [Flutter] Windows桌面程序开发
在今年5月的谷歌I/O 2019大会时, 谷歌就宣布了flutter已经支持全平台开发, 包括 android, ios, mac, linux, windows, web 等 . Flutter桌面 ...
随机推荐
- 查看open office运行状态
打开SSH工具: 1.ps -ef|grep soffice 2.cd /opt/jboss-eap-7.0 3.cd logs 4.tail -f subscription.log 然后就可以操作( ...
- pandas的分布式执行框架之modin
Scale your pandas workflows by changing one line of code To use Modin, replace the pandas impo ...
- WebSocke实时通讯协议
WebSocket 是什么? WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 ...
- C++-int类型整数超出范围后的处理
最近做了一道题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: ...
- [译]Ocelot - Delegating Handlers
原文 可以为HttpClient添加delegating handlers. Usage 为了添加delegating handler需要做两件事. 首先如下一样创建一个类. public class ...
- python下调用pytesseract识别某网站验证码
一.pytesseract介绍 1.pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Pyt ...
- TED学习笔记
20180621(如何做得更好) 多一些探索,询问,聆听,奋斗,成就自己,比一味的做事儿有效的多. 1.刻意让自己的生活在两个区域交替:(1)学习区Learning Zero (2)执行区Perfor ...
- 【medium】220. Contains Duplicate III
因为要考虑超时问题,所以虽然简单的for循环也可以做,但是要用map等内部红黑树实现的容器. Given an array of integers, find out whether there ar ...
- 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析
一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...
- activiti工作流笔记
什么是activiti? Activiti是一个身经百战的业务流程管理引擎, 并且还是一个流程平台 为什么要用工作流引擎? 简单来说,就是为了统一管理流程业务. 想想看,如果要设计一个流程的程序,通常 ...