python GUI基础

hello world

库选择

目前主流的gui库有3个: tkinter, wxpython, pyqt5
关于其的争论在这里
回想起之前被tkinter按在地上摩擦, 为了为数不多的头发, 决定从PyQt5重新开始

安装/helloworld

官方tutorial的hello world如下:

#装好anaconda之后似乎就已经有了
!pip install PyQt5==5.9.2
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication([])
label = QLabel('Hello World!')
label.show()
app.exec_()

界面

控件

控件是GUI的主要组成成分, 官方tutorial的控件集示例:
官方tutorial的控件集示例上图对应位置的控件

Layout

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()

spyder中运行结果示意

小结

  1. 声明app–>创建窗口–>创建布局添加组件–>显示窗口–>运行app
  2. app customizaiton
    2.1 声明app后使用app.setStyle()‘Fusion’,‘Windows’, 'WindowsVista’可选
    2.2 palette = QPalette();palette.setColor(QPalette.ButtonText, Qt.red);app.setPalette(palette) 可以进行自定义主题设置
    2.3 app.setStyleSheet(“QPushButton { margin: 10ex; }”), CSS语法

消息/机制

  1. 布局完成之后, 需要绑定事件才能使程序达到预期的功能
    1.1 事件的绑定往往是通过给指定控件指定相应的函数实现的
    tutorial中用例如下:
from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Click')
def on_button_clicked():
    alert = QMessageBox()
    alert.setText('You clicked the button!')
    alert.exec_()

button.clicked.connect(on_button_clicked)
button.show()
app.exec_()

1.2 可以看出, 消息的绑定主要通过构造函数与connect()实现, 与其他语言一致

转化为可执行程序

在cmd/shell/powershell中的执行

这个是最简单的

在ipython console中的执行

之前的用例, 在ipython中执行且关闭后, 会遇到ipython不能继续工作的bug.后在这里找到了解决方案:

通过某种方式调用app.quit()即可

综合改进的用例:

#pyqtdemo1.py
from PyQt5.QtWidgets import *
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()

button = QPushButton('Click')
button2 = QPushButton('close')
layout.addWidget(button)
layout.addWidget(button2)
def on_button_clicked():
    alert = QMessageBox()
    alert.setText('You clicked the button!')
    alert.exec_()
def on_exit():
#    sys.exit(app.exec_()) #无效
    app.quit()
button.clicked.connect(on_button_clicked)
button2.clicked.connect(on_exit)
window.setLayout(layout)
window.show()
app.exec_()

使用pyinstaller转化为可执行程序

pip install pyinstaller
pyinstaller -w pyqtdemo1.py

之后可以在dist文件夹下找到pyqtdemo1.exe并执行, 由于包含大量dll文件, 整个程序大的离谱(132MB)
此外, 将import *转化为import a,b,c之后, 程序依然为132MB, 与是否import *没有关系
但与cpp程序相比, 如果不去做迁移适配的话, 整个gui程序只有2KB, 这大概就是优势所在

使用fbs转化为可执行程序

在官方的pyqt5 tutorial中采用fbs来打包程序

pip install fbs
fbs startproject
fbs run 

之后可以通过修改 src/main/python/main.py 来改变GUI
值得注意的是, 在这里fbs中引入的ApplicationContext()起到了QApplication([])的作用,在原先代码基础上需作相应替换

#main.py
from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QPushButton, QMessageBox, QWidget

import sys

if __name__ == '__main__':
    appctxt = ApplicationContext()       # 1. Instantiate ApplicationContext
    window = QWidget()
    layout = QVBoxLayout()

    button = QPushButton('Click')
    button2 = QPushButton('close')
    layout.addWidget(button)
    layout.addWidget(button2)
    def on_button_clicked():
        alert = QMessageBox()
        alert.setText('You clicked the button!')
        alert.exec_()
    def on_exit():
    #    sys.exit(app.exec_()) #无效
        window.destroy()
        exit_code = appctxt.app.exec_()      # 2. Invoke appctxt.app.exec_()
        sys.exit(exit_code)
    button.clicked.connect(on_button_clicked)
    button2.clicked.connect(on_exit)
    window.setLayout(layout)
    window.show()
    exit_code = appctxt.app.exec_()      # 2. Invoke appctxt.app.exec_()
    sys.exit(exit_code)

之后执行fbs freeze即可…本该是这样的
重新试了下demo, 依旧卡在fbs freeze, 离谱

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值