micropython教程(Python集成开发环境)

本文旨在通过一个简单的demo,介绍基于Python3、PyQT5的环境下开发桌面应用程序的一种方案,当然开发Python的桌面应用程序不止是PyQT这一种方案,还可以使用Python自带的Tkinter来实现。本文目录:1.安装依赖环境2.安装Eric63.配置Eric4.创建窗口应用4.1创建窗体UI4.2实现代码逻辑参考资料:1.安装依赖环境Eric6官网:htt…

大家好,又见面了,我是你们的朋友全栈君。

本文旨在通过一个简单的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的应用程序界面菜单[设置-首选项]进入,具体配置如下:
micropython教程(Python集成开发环境)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从菜单的插件-插件存储库进入,安装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类中的变量名为:pushButtonplainTextEdit

接着在左侧窗体视图的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学习填坑网友的经验

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126774.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【uva 1153】Keep the Customer Satisfied(算法效率–贪心+优先队列)

    【uva 1153】Keep the Customer Satisfied(算法效率–贪心+优先队列)

    2022年2月22日
    39
  • 2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷[通俗易懂]

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:G3锅炉水处理找解析是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新版教材汇编出G3锅炉水处理仿真模拟考试。2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷1、【多选题】水垢对锅炉的危害主要有浪费燃料()。(ABD)A、.损坏锅炉受热面B、.降低锅炉出力C、.减少供汽时间D、.缩短锅炉使用寿命E、.提高了环境温度2、【多选题】特种设备作业人员应当遵守()规…

    2022年4月14日
    43
  • 微信小程序转二维码教程_小程序码转换成二维码

    微信小程序转二维码教程_小程序码转换成二维码微信小程序转二维码方法分享需要转码的可以看看这个东西是看个人需求的,618就要来了,各种活动也将来袭为了方便小程序邀请活动没法外发,这里分享下将小程序转二维码的方法首先,你需要在电脑上打开https://mp.weixin.qq.com注册一个个人微信订阅号,其次,登陆微信电脑版,微信号关注你注册的订阅号,这是重点注册好了,接下来就是详细步骤1首页-新建群发-选择自建图文-最上边点小程序2选择你要转码的小程序名字或者微信号如“来客有礼”,点下一步3点击“获取更多页

    2022年9月5日
    3
  • beego——XSRF过滤

    beego——XSRF过滤跨站请求伪造,简称XSRF,是Web应用中常见的一个安全问题。当前防范XSRF的一种通用的方法,是对每一个用户都记录一个无法预知的token数据,然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个token数据。如果此数据不匹配,那么这个请求就可能是被伪造的关于XSRF攻击的详细内容可以参考博客:https://www.cnblogs.com/yangmin…

    2022年5月19日
    34
  • Latex插入图片参数设置

    Latex插入图片参数设置常用选项[htbp]是浮动格式:『h』当前位置。将图形放置在正文文本中给出该图形环境的地方。如果本页所剩的页面不够,这一参数将不起作用。『t』顶部。将图形放置在页面的顶部。『b』底部。将图形放置在页面的底部。『p』浮动页。将图形放置在一只允许有浮动对象的页面上。一般使用[htb]这样的组合,只用[h]是没有用的。这样组合的意思就是latex会尽量满足排在前面的浮动格式,就是h-t-b这个…

    2022年5月31日
    38
  • Java sessionID 一直变化的解决方案「建议收藏」

    Java sessionID 一直变化的解决方案「建议收藏」最近在开发一个项目,测试的人员给我说IOS的登录不上去,由于我和他不是一起的,不能面对面的调试,我就自己找问题喽。没成想正让我找到了。问题一:使用IE浏览器访问的时候sessionID一直变化,其他的浏览器没问题。找了半天原因,发现IE登录的时候路径一样的会自动缓存数据,压根就不进你的后台,直接就是没登录,sessionID一直变化也是正常的,这个问题在参数后面加个时间戳就解决了。…

    2022年7月16日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号