★基本框架★
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import ico # 导入图标资源
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
# 设置主界面
QApplication.setStyle('Fusion')
self.setWindowTitle('Title') # 设置窗体名称
self.setWindowIcon(QIcon(':/w.png')) # 设置窗体图标
self.resize(400, 300) # 更改窗体大小
self.setFixedSize(self.width(), self.height()) # 禁止拉伸窗口大小
# 设置控件
self.b_1 = QPushButton("启动", self)
self.b_1.setFixedSize(150, 30) # 设置控件大小
# 设置布局
# widget = QWidget() # QMainWindow需添加
h_1 = QHBoxLayout() # 水平布局
h_1.addWidget(self.b_1)
v = QVBoxLayout() # 垂直布局
# v.addStretch(1)
v.addLayout(h_1)
self.setLayout(v) # QMainWindow需删除
# widget.setLayout(v) # QMainWindow需添加
# self.setCentralWidget(widget) # QMainWindow需添加
# 设置信号
self.b_1.clicked.connect(self.main)
# 槽函数
def main(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
★程序启动画面★
if __name__ == '__main__':
app = QApplication(sys.argv) # 原有
splash = QSplashScreen()
splash.setPixmap(QPixmap('images/splash.jpg'))
splash.show()
splash.showMessage('string', Qt.AlignBottom | Qt.AlignCenter, Qt.white)
demo = Demo() # 原有
demo.show() # 原有
splash.finish(demo)
sys.exit(app.exec_()) # 原有
一、设置主界面
1、窗体字体设置
font = QFont("宋体") # 实例化字体
font.setPixelSize(16) # 设置字体大小
self.setFont(font) 设置字体
2、界面设置
常用:
QApplication.setStyle('Fusion') # 设置控件样式
self.setWindowTitle('title') # 设置窗体名称
self.resize(300, 250) # 更改窗体大小
self.setFixedSize(self.width(), self.height()) # 设置固定界面(控件)大小,不能拉伸,也不能最大化
其他:
self.setWindowIcon('path') # 设置窗体图标
self.size() # 获取窗体大小
self.width() # 获取窗体宽度
self.height() # 获取窗体高度
self.setFixedWidth(int width) # 设置窗体宽度
self.setFixedHeight(int height) # 设置窗体高度
self.setGeometry(int x, int y, int width, int height) # 设置窗口位置
self.frameGeometry() # 获取窗口的大小和位置
self.move(int x, int y) # 设置窗口的位置
self.pos() # 获取窗口左上角坐标
self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) # 禁止最大化按钮
QStyleFactory.keys() # 获取当前平台支持的样式
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # 窗口置顶
# self.setWindowFlags(QtCore.Qt.Widget) #取消置顶
setWindowFlags的参数:
参数 |
说明 |
FramelessWindowHint |
设置窗体无边框,不可拖动拖拽拉伸 |
MSWindowsFixedSizeDialogHint |
固定窗口,无法调整大小 |
CustomizeWindowHint |
有边框,无标题栏与按钮,不能移动和拖动 |
WindowTitleHint |
添加标题栏与关闭按钮 |
WindowSystemMenuHint |
添加系统目录和关闭按钮 |
WindowMaximizeButtonHint |
激活最大化按钮与关闭按钮,禁止最小化按钮 |
WindowMinimizeButtonHint |
激活最小化按钮与关闭按钮,禁止最大化按钮 |
WindowMinMaxButtonsHint |
激活最大化与最小化按钮和关闭按钮 |
WindowCloseButtonHint |
设置窗口的标题栏只有关闭的按钮 |
WindowContextHelpButtonHint |
添加问号与关闭按钮,像对话框一样 |
WindowStaysOnTopHint |
窗口始终处于顶部位置 |
windowStaysOnButtonHint |
窗口始终处于底部位置 |
PS:多个参数之间用竖杠'|'
分隔。
二、设置控件
1、QMessageBox消息框
1、基本格式
QMessageBox.information(QWidget, ‘Title’, ’Content‘, buttons)
第一个参数填self,表示该信息框属于我们这里的Demo窗口;第二个参数类型为字符串,填入的是该信息框的标题;第三个参数类型也是字符串,填入的是信息框的提示内容;最后个参数为信息框上要添加的按钮。多个按钮之间用
| 来连接,常见的按钮种类有以下几种:
QMessageBox.Ok
QMessageBox.Yes
QMessageBox.No
QMessageBox.Close
QMessageBox.Cancel
QMessage.Open
QMessage.Save
2、各种类型的框
类型 |
名称 |
QMessageBox.information |
消息框 |
QMessageBox.question |
问答框 |
QMessageBox.warning |
警告框 |
QMessageBox.critical |
错误框 |
QMessageBox.about |
关于框 |
3、与消息框进行交互
choice = QMessageBox.question(self, 'Title', 'Content', QMessageBox.Yes | QMessageBox.No)
if choice == QMessageBox.Yes:
pass
elif choice == QMessageBox.No:
pass
2、文本编辑框和文本浏览框
实例化控件
self.text_edit = QTextEdit(self) # 文本编辑框
self.text_browser = QTextBrowser(self) # 文本浏览框
设置信号
控件类型 |
信号 |
描述 |
QTextEdit |
textChanged |
文本发生改变 |
控件方法
控件类型 |
方法 |
描述 |
QTextEdit |
setText(‘Content’) |
设置文本 |
QTextEdit |
toPlainText() |
获取文本 |
QTextEdit |
setTextColor(color) |
设置文本颜色 |
QTextEdit |
setFont(font) |
设置字体 |
3、各种按钮
QPushButton,QToolButton,QRadioButton和QCheckBox均继承自QAbstractButton类
实例化控件
self.test_button = QPushButton('Test', self) # 实例化按钮
self.test_button = QPushButton('&Download',self) # 实例化按钮并设置快捷键为Alt+D
self.test_button = QToolButton(self) # 工具按钮(初始不能传入文本)
self.on_button = QRadioButton('on', self) # 单选按钮
self.checkbox1 = QCheckBox('Checkbox 1', self) # 复选框的三种状态:全选中、半选中和无选中
设置信号
控件类型 |
信号 |
描述 |
通用 |
Pressed |
当鼠标指针在按钮上并按下左键时触发该信号 |
通用 |
Released |
当鼠标左键被释放时触发该信号 |
通用 |
Clicked |
当鼠标左键被按下然后释放时,或者快捷键被释放时触发该信号 |
通用 |
Toggled |
当按钮的标记状态发生改变时触发该信号 |
QCheckBox |
stateChanged |
复选框状态发生改变 |
控件方法
控件类型 |
方法 |
描述 |
通用 |
isDown() |
提示按钮是否已按下 |
通用 |
isChecked() |
提示按钮是否已经标记 |
通用 |
isEnable() |
提示按钮是否可以被用户点击 |
通用 |
isCheckAble() |
提示按钮是否为可标记的 |
通用 |
setAutoRepeat() |
设置按钮是否在用户长按时可以自动重复执行 |
通用 |
setShortcut(‘Ctrl+D’) |
设置按钮快捷键 |
QPushButton |
setCheckable(True) |
设置按钮是否已经被选中,如果设置True,则表示按钮将保持已点击和释放状态 |
QPushButton |
toggle() |
在按钮状态之间进行切换 |
QPushButton |
setIcon(QIcon(‘button.png’)) |
设置图标 |
QPushButton |
setEnabled() |
设置按钮是否可以使用,当设置为False时,按钮变成不可用状态,点击它不会发射信号 |
QPushButton |
isChecked() |
判断按钮是否为标记状态,若是则返回True,不是则返回False |
QPushButton |
setDefault() |
设置按钮的默认状态 |
QPushButton |
setText(‘text’) |
设置按钮的显示文本 |
QPushButton |
text() |
返回按钮的显示文本 |
QToolButton |
setArrowType(参数1) |
设定button上显示的箭头类型 |
QToolButton |
setToolButtonStyle(参数2) |
设定button文本和图标显示的样式 |
QRadioButton |
setChecked(True) |
单选按钮设为选中状态 |
QCheckBox |
setChecked(True) |
将复选框设为选中或无选中状态 |
QCheckBox |
setCheckState(Qt.Checked) |
选中状态Qt.Checked, 无选中状态Qt.Unchecked和半选中状态Qt.PartiallyChecked |
QCheckBox |
setTristate(True) |
让一个复选框拥有三种状态 |
QCheckBox |
setCheckState(Qt.PartiallyChecked) |
让一个复选框拥有三种状态 |
QCheckBox |
checkState() |
获取当前复选框的状态,返回值为int类型,0为无选中状态,1为半选中状态,2为选中状态 |
参数1 |
箭头属性 |
Qt.NoArrow |
无箭头 |
Qt.UpArrow |
向上的箭头 |
Qt.DownArrow |
向下的箭头 |
Qt.LeftArrow |
向左的箭头 |
Qt.RightArrow |
向右的箭头 |
参数2 |
样式 |
Qt.ToolButtonIconOnly |
只显示图标 |
Qt.ToolButtonTextOnly |
只显示文本 |
Qt.ToolButtonTextBesideIcon |
文本在图标下面 |
Qt.ToolButtonTextUnderIcon |
文本在图标上面 |
Qt.ToolButtonFollowStyle |
未知… |
4、标签
实例化控件
self.label = QLabel(self)
控件方法
控件类型 |
方法 |
描述 |
QLabel |
setPixmap(QPixmap(‘on.png’)) |
给标签设置图片 |
QLabel |
setAlignment(Qt.AlignCenter) |
设置标签对齐方式 |
5、单行文本框
实例化控件
self.lineedit = QLineEdit(self)
控件方法
控件类型 |
方法 |
描述 |
QLineEdit |
setFont(combobox.currentFont()) |
设置字体 |
QLineEdit |
setPlaceholderText() |
设置文本框显示文字 |
QLineEdit |
setMaxLength() |
设置文本框所允许输入的最大字符数 |
QLineEdit |
setReadOnly() |
设置文本为只读 |
QLineEdit |
setText() |
设置文本框的内容 |
QLineEdit |
text() |
返回文本框的内容 |
QLineEdit |
setDragEnable() |
设置文本框是否接受拖动 |
QLineEdit |
selectAll() |
全选 |
QLineEdit |
setFocus() |
得到焦点 |
QLineEdit |
setAlignment(参数1) |
按固定值方式对齐文本 |
QLineEdit |
setEchoMode(参数2) |
设置文本框的显示格式 |
QLineEdit |
setValidator(参数3) |
设置文本框的验证器(验证规则),将限制任意可能输入的文本 |
QLineEdit |
setInputMask(参数4) |
设置掩码 |
参数1 |
功能 |
Qt.AlignLeft |
水平方向靠左对齐 |
Qt.AlignRight |
水平方向靠右对齐 |
Qt.AlignCenter |
水平方向居中对齐 |
Qt.AlignJustify |
水平方向调整间距两端对齐 |
Qt.AlignTop |
垂直方向靠上对齐 |
Qt.AlignBottom |
垂直方向靠下对齐 |
Qt.AlignVCenter |
垂直方向居中对齐 |
参数2 |
功能 |
QLineEdit.Normal |
正常显示所输入的字符,此为默认选项 |
QLineEdit.NoEcho |
不显示任何输入的字符,常用于密码类型的输入,且长度保密 |
QLineEdit.Password |
显示与平台相关的密码掩饰字符,而不是实际输入的字符 |
QLineEdit.PasswordEchoOnEdit |
在编辑时显示字符,负责显示密码类型的输入 |
参数3 |
功能 |
QIntValidator |
限制输入整数 |
QDoubleValidator |
限制输入浮点数 |
QRegexpValidator |
检查输入是否符合正则表达式 |
参数4 |
功能 |
000.000.000.000;_ |
ip地址,空白字符是‘_’ |
HH:HH:HH:HH:HH:HH; |
MAC地址 |
0000-00-00 |
日期,空白字符是空格 |
>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;# |
许可证号,空白字符是‘_’,所有字母都转换为大写 |
设置信号
控件类型 |
信号 |
描述 |
QLineEdit |
selectionChanged |
只要选择改变了,这个信号就会发射 |
QLineEdit |
textChanged |
当修改文本内容时,这个信号就会发射 |
QLineEdit |
editingFinished |
当编辑文本结束时,这个信号就会发射 |
6、下拉选择框和数字调节框
实例化控件
self.combobox_1 = QComboBox(self) # 普通下拉框(无内容)
self.combobox_2 = QFontComboBox(self) # 字体下拉框(有字体选择)
self.spinbox = QSpinBox(self) # 数字调节框(默认范围0-99)
self.doublespinbox = QDoubleSpinBox(self) # 浮点数字调节框(默认范围0.00-99.99)
设置信号
控件类型 |
信号 |
描述 |
QComboBox |
currentIndexChanged |
序号发生变化 |
QComboBox |
currentTextChanged |
文本发生变化 |
QSpinBox |
valueChanged |
数字发生变化 |
控件方法
控件类型 |
方法 |
描述 |
QComboBox |
setCurrentIndex(2) |
设置默认值选项 |
QComboBox |
addItem(self.choice) |
添加一个选项 |
QComboBox |
addItems(self.choice_list) |
添加多个选项 |
QComboBox |
currentIndex() |
获取当前文本序号 |
QComboBox |
currentText() |
获取当前文本 |
QComboBox |
currentFont() |
获取当前字体 |
QDoubleSpinBox |
setDecimals(int) |
设置小数位数 |
QSpinBox |
setRange(-99, 99) |
设置范围 |
QSpinBox |
setSingleStep(1) |
设置步长,即每次点击递增或递减多少值 |
QSpinBox |
setValue(66) |
设置初始显示值 |
QSpinBox |
value() |
获取值 |
QSpinBox |
setValue(value) |
设置调节框的值 |
7、滑动条和旋钮
实例化控件
self.slider_1 = QSlider(Qt.Horizontal, self) # 水平滑动条
self.slider_2 = QSlider(Qt.Vertical, self) # 垂直滑动条
self.dial = QDial(self) # 旋钮
设置信号
控件类型 |
信号 |
描述 |
QSlider |
valueChanged |
数值发生改变 |
QDial |
valueChanged |
改变表盘数值 |
控件方法
控件类型 |
方法 |
描述 |
QSlider |
setRange(0, 100) |
设置滑动条的范围 |
QSlider |
setMinimum(0) |
设置最小值 |
QSlider |
setMaximum(100) |
设置最大值 |
QSlider |
value() |
获取值 |
QSlider |
setValue(value) |
设置值 |
QDial |
setFixedSize(100, 100) |
固定旋钮的大小 |
QDial |
setRange(0, 100) |
设置表盘数值范围 |
QDial |
setMinimum(0) |
设置最小值 |
QDial |
setMaximum(100) |
设置最大值 |
QDial |
setNotchesVisible(True) |
显示刻度 |
8、定时器和进度条
实例化控件
self.timer = QTimer(self) # 定时器
self.progressbar = QProgressBar(self) # 进度条,默认是水平的
self.progressbar.setOrientation(Qt.Vertical) # 让进度条垂直显示
设置信号
控件类型 |
信号 |
描述 |
QTimer |
timeout |
timer.start()结束时触发 |
控件方法
控件类型 |
方法 |
描述 |
QTimer |
isActive() |
判断定时器是否处于激活状态 |
QTimer |
start(100) |
启动计时器持续100毫秒 |
QTimer |
stop() |
停止计时器 |
QTimer |
setSingleShot(True) |
触发timeout信号后只调用一次update_func() |
QProgressBar |
setMinimum(0) |
设置最小值 |
QProgressBar |
setMaximum(100) |
设置最大值 |
QProgressBar |
setRange(0, 100) |
设置范围 |
QProgressBar |
setValue(value) |
设置进度条当前值 |
QProgressBar |
reset() |
重置进度条的值 |
9、数字显示屏
实例化控件
self.lcd = QLCDNumber(self) # 数字显示屏
控件方法
控件类型 |
方法 |
描述 |
QLCDNumber |
setDigitCount(10) |
设置显示多少位数字 |
QLCDNumber |
display(1234567890) |
显示数字 |
QLCDNumber |
setSegmentStyle(参数1) |
设置显示屏数字样式 |
QLCDNumber |
setSmallDecimalPoint(True) |
设置小数点的显示方式,若为True,则占位,若为False,则会单独占位 |
QLCDNumber |
display(0.123456789) |
显示数字 |
QLCDNumber |
display(‘HELLO’) |
显示字母 |
QLCDNumber |
setMode(参数2) |
更改数字显示方式 |
参数1 |
值 |
描述 |
QLCDNumber.Outline |
0 |
让内容浮显,其颜色同显示屏背景颜色相同 |
QLCDNumber.Filled |
1 |
让内容浮显,颜色同窗口标题颜色相同 |
QLCDNumber.Flat |
2 |
让内容扁平化显示,颜色同窗口标题颜色相同 |
参数2 |
值 |
描述 |
QLCDNumber.Hex |
0 |
十六进制 |
QLCDNumber.Dec |
1 |
十进制 |
QLCDNumber.Oct |
2 |
八进制 |
QLCDNumber.Bin |
3 |
二进制 |
10、状态栏
实例化控件
self.statusbar = self.statusBar() # 状态栏
控件方法
控件类型 |
方法 |
描述 |
addWidget() |
在状态栏中添加给定的窗口小控件对象 |
|
addPermanentWidget() |
在状态栏中永久添加给定的窗口小控件对象 |
|
showMessage() |
在状态栏显示一条临时信息,指定时间间隔 |
|
clearMessage() |
删除正在显示的临时信息 |
|
removeWidget() |
从状态栏中移除指定的小控件 |
|
添加小控件语法
self.statusbar.addPermanentWidget(self.label, stretch=0) # 控件,控件占据空间
状态栏添加进度条
# 设置状态栏
self.statusBar = QStatusBar()
self.statusBar.setStyleSheet('QStatusBar::item {border: none;}')
self.setStatusBar(self.statusBar)
# 设置进度条和标签
self.progressBar = QProgressBar()
self.label1 = QLabel()
self.label1.setText("")
# 状态栏添加控件
self.statusBar.addPermanentWidget(self.label1, stretch=1)
self.statusBar.addPermanentWidget(self.progressBar, stretch=4)
11、HTML展示控件
模块安装:pip install PyQtWebEngine
self.web = QWebEngineView()
方法 |
描述 |
load(QUrl url) |
加载指定的URL并显示 |
setHtml(QString&html) |
将网页视图的内容设置为指定的HTML内容 |
三、设置布局
1、实例化布局
v_layout = QVBoxLayout() # 垂直布局
h_layout = QHBoxLayout() # 水平布局
form_layout = QFormLayout() # 表单布局
grid_layout = QGridLayout() # 网格布局
2、给布局添加占位符|控件|布局
self.label.setAlignment(Qt.AlignCenter) # 设置居中方式
h_layout.addStretch(1) # 设置占位符
v_layout.addWidget(self.user_label) # 垂直布局添加控件
h_layout.addWidget(self.user_line) # 水平布局添加控件
all_v_layout.addLayout(v_layout) # 垂直布局添加垂直布局
all_h_layout.addLayout(h_layout) # 水平布局添加水平布局
form_layout.addRow(self.user_label, self.user_line) # 表单布局添加控件
grid_layout.addWidget(self.user_label, 0, 0, 1, 1) # 网格布局添加控件
grid_layout.addWidget(self.user_label, 0, 0) # 默认是1行1列
QGridLayout的addWidget()方法遵循如下语法形式:
addWidget(widget, row, column, rowSpan, columnSpan)
widget就是要添加的控件;row为第几行,0代表第一行;column为第几列,0代表第一列;rowSpan表示要让这个控件去占用几行(默认一行);columnSpan表示要让这个控件去占用几列(默认一列)。
3、设为整个窗口的最终布局方式
self.setLayout(all_h_layout)
四、各种对话框
1、颜色对话框和字体对话框
color = QColorDialog.getColor() # 颜色对话框(十六进制的值会保存在color变量中)
if color.isValid(): # 判断color是否有效
self.text_edit.setTextColor(color)
font, ok = QFontDialog.getFont() # 字体对话框
if ok:
self.text_edit.setFont(font)
2、输入对话框
方法 |
用法 |
getItem() |
从下拉框中获取选项输入 |
getInt() |
获取整型值输入 |
getDouble() |
获取浮点型值输入 |
getText() |
获取字符串输入 |
getMultiLineText() |
获取多行字符串输入 |
实例:
content, ok = QInputDialog.getText(self, 'title', 'content')
content, ok = QInputDialog.getInt(self, 'title', 'content')
content, ok = QInputDialog.getDouble(self, 'title', 'content')
content, ok = QInputDialog.getMultiLineText(self, 'title', 'content')
Item, ok = QInputDialog.getItem(self, 'title', 'content', list, 0, False)
getItem(parent, str, str, iterable, int,
bool)方法需要多设置几个参数,前三个与getText()相同,第四个参数为要加入的选项内容,第五个参数为最初显示的选项,最后一个参数是选项内容是否可编辑。
3、文件对话框
path, _ = QFileDialog.getSaveFileName(self, 'title', './', 'Excel Files (*.xlsx;*.xls);;All Files (*)') # 选择保存文件
path, _ = QFileDialog.getOpenFileName(self, 'title', './', 'Excel Files (*.xlsx;*.xls);;All Files (*)') # 选择文件
path, _ = QFileDialog.getOpenFileNames(self, 'title', './', 'Excel Files (*.xlsx;*.xls);;All Files (*)') # 选择多个文件
path = QFileDialog.getExistingDirectory(self, 'title', './') # 选择文件夹
参数:指定父类,文件对话框的标题,对话框打开时显示的路径,文件扩展名过滤器 其中设置文件扩展名过滤,用双分号间隔。
'All Files (*);;PDF Files (*.pdf);;Excel Files (*.xlsx;*.xls);;Text Files (*.txt)'
五、界面关闭事件
def closeEvent(self, QCloseEvent): # 关闭事件函数
if not self.saved: # 如果未保存
choice = QMessageBox.question(self, '', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if choice == QMessageBox.Yes: # 如果需要继续保存
self.saved_func() # 调用函数进行保存
QCloseEvent.accept() # 接受关闭事件
elif choice == QMessageBox.No: # 如果不需要继续保存
QCloseEvent.accept() # 接受关闭事件
else:
QCloseEvent.ignore() # 忽略关闭事件
六、多窗口实例
1、同一个主界面下切换
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Demo(QDialog):
def __init__(self):
super().__init__()
self.init_ui()
self.f_1()
self.f_2()
def init_ui(self):
# 设置基本窗口
self.setWindowTitle('界面')
self.setFixedSize(300, 200)
self.setWindowFlags(Qt.WindowCloseButtonHint)
def f_1(self):
# 实例化框架1
self.frame1 = QFrame(self)
# 设置框架大小
self.frame1.setFixedSize(300, 200)
# 设置控件
self.Button1 = QPushButton("按钮1")
self.Button2 = QPushButton("按钮2")
self.Button_enter = QPushButton("进入下一个界面")
self.Button_enter.setFixedSize(150, 35)
# 设置布局
self.h = QHBoxLayout()
self.h1 = QHBoxLayout()
self.v = QVBoxLayout()
self.h.addWidget(self.Button1)
self.h.addWidget(self.Button2)
self.h1.addWidget(self.Button_enter)
self.v.addLayout(self.h)
self.v.addLayout(self.h1)
self.frame1.setLayout(self.v)
# 设置信号
self.Button_enter.clicked.connect(self.enter_clicked)
def f_2(self):
# 实例化框架2
self.frame2 = QFrame(self)
# 设置框架大小
self.frame2.setFixedSize(300, 200)
# 设置控件
self.Button_quit = QPushButton("回到主页面")
self.Button_quit.setFixedSize(150, 35)
# 设置布局
self.h = QHBoxLayout()
self.h.addWidget(self.Button_quit)
self.frame2.setLayout(self.h)
# 设置框架2不显示
self.frame2.setVisible(False)
# 设置信号
self.Button_quit.clicked.connect(self.quit_clicked)
def enter_clicked(self):
self.frame2.setVisible(True)
self.frame1.setVisible(False)
def quit_clicked(self):
self.frame2.setVisible(False)
self.frame1.setVisible(True)
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = Demo()
if demo.exec_() == QDialog.Accepted:
sys.exit(app.exec_())
2、多个界面间切换
import sys
from PyQt5.QtWidgets import *
class FirstUi(QWidget): # 第一个窗口类
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设置界面
self.setFixedSize(300, 200)
self.setWindowTitle('First Ui')
# 设置控件
self.btn = QPushButton('jump')
# 设置布局
h = QHBoxLayout()
h.addWidget(self.btn)
self.setLayout(h)
# 设置信号
self.btn.clicked.connect(self.slot_btn_function) # 将信号连接到槽
def slot_btn_function(self):
# self.hide() # 隐藏此窗口
# self.close() # 决定是否关闭当前界面打开新界面
self.s = SecondUi()
self.s.show()
class SecondUi(QWidget): # 建立第二个窗口的类
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设置界面
self.setFixedSize(500, 350)
self.setWindowTitle('Second Ui')
# 设置控件
self.btn = QPushButton('jump')
# 设置布局
h = QHBoxLayout()
h.addWidget(self.btn)
self.setLayout(h)
# 设置信号
self.btn.clicked.connect(self.slot_btn_function) # 将信号连接到槽
def slot_btn_function(self):
# self.hide() # 隐藏此窗口
self.close() # 决定是否关闭当前界面打开新界面
self.f = FirstUi()
self.f.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = FirstUi()
w.show()
sys.exit(app.exec_())
七、问题集锦
1、多进程冻结窗口
问题描述: 在启动多进程时会出现多个窗口
解决方法:
import multiprocessing as mp
mp.freeze_support() # 多进程冻结窗口
在if __name__ == '__main__':
上面添加上述代码
2、win32com多线程
问题描述: 在多线程中使用win32com接口时报错
解决方法: 在调用接口及使用相关代码的前后添加函数
import pythoncom
pythoncom.CoInitialize()
pythoncom.CoUninitialize()
Coinitialize是Windows提供的API函数,用来告诉Windows系统单独一个线程创建COM对象。也就是说我这个多线程的脚本里面的线程和这个COM对象的线程创建一个套间,令其可以正常关联和执行。
3、状态栏消息刷新显示
问题描述: 使用多个statusbar.showMessage,界面只显示最后一个消息
解决方法: 添加语句QApplication.processEvents()让屏幕实时刷新,添加时间间隔让程序流畅运行
self.statusbar.showMessage(text)
QApplication.processEvents()
time.sleep(0.01)
4、selenium打包关闭黑框
找到selenium包的文件夹下的servise.py
C:\Users\liuzhi\AppData\Local\Programs\Python\Python38\Lib\site-packages\selenium\webdriver\common\service.py
定位到75行,将源代码修改为:
self.process = subprocess.Popen(cmd, env=self.env,
close_fds=platform.system() != 'Windows',
stdout=self.log_file,
stderr=self.log_file,
stdin=PIPE,
creationflags=134217728)
5、pyecharts打包失败
新建py文件hook-pyecharts.py
放在PyInstaller安装目录下
\AppData\Roaming\Python\Python37\site-packages\PyInstaller\hooks\
#-----------------------------------------------------------------------------
# Copyright (c) 2017-2020, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License (version 2
# or later) with exception for distributing the bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#
# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception)
#-----------------------------------------------------------------------------
# Hook for nanite: https://pypi.python.org/pypi/nanite
from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files('pyecharts')