开个坑,关于PyQt5的一系列文章。
一、背景
作为快乐的程序员,当然要有一个快乐辞职方式,先看看demo:
程序员正确的辞职方式
今天我们学着用PyQt5来写一个类似的小程序吧!
展示
动画 00_00_00-00_00_30~1.gif
二、需求拆解
功能分解:
1.主窗口有两个按钮:同意和拒绝;
2.点击同意弹出界面,点击拒绝随机移动主窗口。
三、代码设计
3.1布局主窗口
class CMainWindow(QtWidgets.QWidget):
def __init__(self, p=None):
QtWidgets.QWidget.__init__(self, p)
self._init_ui()
def _init_ui(self):
"""
功能:生成两个按钮
"""
self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.setWindowTitle("离职批准")
layout = QtWidgets.QHBoxLayout()
self.setLayout(layout)
btn_accept = QtWidgets.QPushButton(self) # 同意按钮
btn_accept.setText("同意")
layout.addWidget(btn_accept)
btn_accept.clicked.connect(self._click_accept)
btn_reject = QtWidgets.QPushButton(self) # 拒绝按钮
btn_reject.setText("拒绝")
btn_reject.clicked.connect(self._click_reject)
layout.addWidget(btn_reject)
3.2同意按钮
点击弹出按钮,回调函数弹出感谢窗口
def _click_accept(self):
"""
功能:点击同意
"""
reply = QtWidgets.QMessageBox.information(
self, '已批准', '谢谢领导批准!', QtWidgets.QMessageBox.Yes)
if reply:
self.close()
3.3拒绝按钮
点击拒绝按钮,回调移动窗口函数
def _click_reject(self):
"""
功能:点击拒绝
"""
self._move_randomly()
3.4主窗口随机移动
def _move_randomly(self):
"""
功能:随机移动
"""
desktop = QtWidgets.QDesktopWidget()
geo = desktop.availableGeometry() # 获取工作屏幕的大小参数
def get_random_pos():
"""
:return:返回在屏幕上的随机一个点
"""
pos_x = int(random.random() * geo.width())
pos_y = int(random.random() * geo.height())
return (pos_x, pos_y)
def get_pos():
"""
:return:返回一个不在当前窗口内的点
"""
x, y = get_random_pos()
while self.geometry().contains(QtCore.QPoint(x, y)):
x, y = get_random_pos()
return (x, y)
self.resize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.move(*get_pos())
源代码
import random
from PyQt5 import QtWidgets
from PyQt5 import QtCore
WINDOW_WIDTH = 500
WINDOW_HEIGHT = 200
class CMainWindow(QtWidgets.QWidget):
def __init__(self, p=None):
QtWidgets.QWidget.__init__(self, p)
self._init_ui()
def _init_ui(self):
"""
功能:生成两个按钮
"""
self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.setWindowTitle("离职批准")
layout = QtWidgets.QHBoxLayout()
self.setLayout(layout)
btn_accept = QtWidgets.QPushButton(self) # 同意按钮
btn_accept.setText("同意")
layout.addWidget(btn_accept)
btn_accept.clicked.connect(self._click_accept)
btn_reject = QtWidgets.QPushButton(self) # 拒绝按钮
btn_reject.setText("拒绝")
btn_reject.clicked.connect(self._click_reject)
layout.addWidget(btn_reject)
def _click_accept(self):
"""
功能:点击同意
"""
reply = QtWidgets.QMessageBox.information(
self, '已批准', '谢谢领导批准!', QtWidgets.QMessageBox.Yes)
if reply:
self.close()
def _click_reject(self):
"""
功能:点击拒绝
"""
self._move_randomly()
def _move_randomly(self):
"""
功能:随机移动
"""
desktop = QtWidgets.QDesktopWidget()
geo = desktop.availableGeometry() # 获取工作屏幕的大小参数
def get_random_pos():
"""
:return:返回在屏幕上的随机一个点
"""
pos_x = int(random.random() * geo.width())
pos_y = int(random.random() * geo.height())
return (pos_x, pos_y)
def get_pos():
"""
:return:返回一个不在当前窗口内的点
"""
x, y = get_random_pos()
while self.geometry().contains(QtCore.QPoint(x, y)):
x, y = get_random_pos()
return (x, y)
self.resize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.move(*get_pos())
def main():
app = QtWidgets.QApplication([])
main_window = CMainWindow()
main_window.show()
app.exec_()
if __name__ == "__main__":
main()