開(kāi)個(gè)坑魏滚,關(guān)于PyQt5的一系列文章坟漱。
一、背景
作為快樂(lè)的程序員腥寇,當(dāng)然要有一個(gè)快樂(lè)辭職方式觅捆,先看看demo:
程序員正確的辭職方式
今天我們學(xué)著用PyQt5來(lái)寫(xiě)一個(gè)類(lèi)似的小程序吧!
展示
動(dòng)畫(huà) 00_00_00-00_00_30~1.gif
二掂摔、需求拆解
功能分解:
1.主窗口有兩個(gè)按鈕:同意和拒絕乙漓;
2.點(diǎn)擊同意彈出界面释移,點(diǎn)擊拒絕隨機(jī)移動(dòng)主窗口。
三趋观、代碼設(shè)計(jì)
3.1布局主窗口
class CMainWindow(QtWidgets.QWidget):
def __init__(self, p=None):
QtWidgets.QWidget.__init__(self, p)
self._init_ui()
def _init_ui(self):
"""
功能:生成兩個(gè)按鈕
"""
self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.setWindowTitle("離職批準(zhǔn)")
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同意按鈕
點(diǎn)擊彈出按鈕锋边,回調(diào)函數(shù)彈出感謝窗口
def _click_accept(self):
"""
功能:點(diǎn)擊同意
"""
reply = QtWidgets.QMessageBox.information(
self, '已批準(zhǔn)', '謝謝領(lǐng)導(dǎo)批準(zhǔn)豆巨!', QtWidgets.QMessageBox.Yes)
if reply:
self.close()
3.3拒絕按鈕
點(diǎn)擊拒絕按鈕,回調(diào)移動(dòng)窗口函數(shù)
def _click_reject(self):
"""
功能:點(diǎn)擊拒絕
"""
self._move_randomly()
3.4主窗口隨機(jī)移動(dòng)
def _move_randomly(self):
"""
功能:隨機(jī)移動(dòng)
"""
desktop = QtWidgets.QDesktopWidget()
geo = desktop.availableGeometry() # 獲取工作屏幕的大小參數(shù)
def get_random_pos():
"""
:return:返回在屏幕上的隨機(jī)一個(gè)點(diǎn)
"""
pos_x = int(random.random() * geo.width())
pos_y = int(random.random() * geo.height())
return (pos_x, pos_y)
def get_pos():
"""
:return:返回一個(gè)不在當(dāng)前窗口內(nèi)的點(diǎn)
"""
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):
"""
功能:生成兩個(gè)按鈕
"""
self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
self.setWindowTitle("離職批準(zhǔn)")
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):
"""
功能:點(diǎn)擊同意
"""
reply = QtWidgets.QMessageBox.information(
self, '已批準(zhǔn)', '謝謝領(lǐng)導(dǎo)批準(zhǔn)熊户!', QtWidgets.QMessageBox.Yes)
if reply:
self.close()
def _click_reject(self):
"""
功能:點(diǎn)擊拒絕
"""
self._move_randomly()
def _move_randomly(self):
"""
功能:隨機(jī)移動(dòng)
"""
desktop = QtWidgets.QDesktopWidget()
geo = desktop.availableGeometry() # 獲取工作屏幕的大小參數(shù)
def get_random_pos():
"""
:return:返回在屏幕上的隨機(jī)一個(gè)點(diǎn)
"""
pos_x = int(random.random() * geo.width())
pos_y = int(random.random() * geo.height())
return (pos_x, pos_y)
def get_pos():
"""
:return:返回一個(gè)不在當(dāng)前窗口內(nèi)的點(diǎn)
"""
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()