PyQt5的入門到放棄


安裝及界面繪制

首先安裝pyqt5及pyqt5tools,使用豆瓣源
pip install pyqt5 -i https://pypi.doubanio.com/simple/
pip install pyqt5-tools -i https://pypi.doubanio.com/simple/

在安裝完成后,通過Qt Designer創建自己想要的界面,創建完成后在ui文件所在路徑通過cmd執行
pyuic5 -o mainpage.py mainpage.ui
將mainpage轉換為py文件
py文件內容為:

class Ui_mainpage(object):
    def setupUi(self, mainpage):
        ...

再創建一個新的py文件,如main.py去調用該界面文件
新py文件內容如下:

class main(QmainWindow, Ui_mainpage):
    def __init__(self, parent=None):
        super().__init__()
        ...

pyqt的一些常用代碼

設置界面電腦屏幕居中

def center_setting(self):
    '''居中顯示'''
    screen = QDesktopWidget().screenGeometry()
    size = self.geometry()
    w = (screen.width() - size.width()) / 2
    h = (screen.height() - size.height()) / 2
    self.move(w, h)

 

設置界面圖標,該方法在將腳本生成為exe后,仍然需要在exe所在文件夾下放置圖標,否則圖標會失效

def icon_setting(self):
    self.setWindowIcon(QIcon('xxx.ico'))

 

設置界面大小為固定值,且不可改動,如伸縮、最大

def windowsize_setting(self):
    '''不可調整大小'''
    self.setFixedSize(1190, 615)

 

設置背景顏色或圖片,生成為exe后,圖片仍需像icon圖標一樣處理

def background_setting(self):
    '''背景顏色或圖片'''
    bg = QtGui.QPalette()
    # 背景顏色
    bg.setColor(self.backgroundRole(), QColor(248, 248, 255))
    # 背景圖片
    # bg.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap('')))
    self.setPalette(bg)
    self.setAutoFillBackground(True)

 

pyqtSlot()修飾器可以將按鈕操作直接定義為一個方法,如下,名為buttonname的按鈕在被點擊后,會執行...中的代碼

@pyqtSlot()
def on_buttonname_clicked(self):
    ...

 

下拉框添加數據及點擊對應下拉框選項的信號發射

# 如果獲得的數據是列表
if isinstance(namelist, list):
    self.drop_down_box.addItems(namelist)
# 如果獲得的數據非列表
if isinstance(name, str):
    self.drop_down_box.addItem(name)

# 選中某個下拉框選項時,發射該信號去執行new_func方法
self.drop_down_box.connect(self.new_func)
def new_func(self, i):
    # i為被選中的值
    ...

 

QMessageBox提示框,個人比較喜歡這個提示框,主要是代碼量少,下圖為其表現

def operation_fail(self, txt):
    '''操作失敗提示'''
    notice = QMessageBox.about(self, '提示', txt)

 

繪制線形圖

使用的庫為pyqtgraph
pyqtgraph如果想去了解,可直接用以下代碼喚起其演示界面,其常用代碼均可在該界面上找到

import pyqtgraph.explames as pg_e
pg_e.run()

 

因為沒有設計'展示鼠標所在點的坐標'的功能,所以繪制線形圖使用GraphicsLayoutWidget,其實現原理,簡單來說就是給一個列表,然后直接把列表數據刷在界面上,各種數據點直接用線連起來

首先需要在Qt Designer中生成對應控件,Qt Designer無法直接創建GraphicsLayoutWidget,首先需要創建一個Widget,再將其提升為GraphicsLayoutWidget,具體如下:

GraphicsLayoutWidget控件的一些基本設置

import pyqtgraph as pg
def glw_setting(self):
    '''GraphicsLayoutWidget控件的背景、線條設置,需要在setupUi前執行'''
        # 控件的背景顏色
    pg.setConfigOption('background', (248, 248, 255))
        # 線條的顏色
    pg.setConfigOption('foreground', 'k')
        # 啟用抗鋸齒( 讓曲線更加光滑)
    pg.setConfigOptions(antialias=True)

def _glw_setting(self):
    '''GraphicsLayoutWidget控件的部分設置,需要在setupUi后設置'''
    # 設置標題
    cpu = self.glwname.addPlot(title="xxx")
    # 設置x軸刻度范圍為0到10
    cpu.setXRange(0, 10, padding=0)
    # 設置y軸刻度
    cpu.setYRange(0, 10, padding=0)
繪制代碼如下

def glwname_show_on_layout(self):
    mylist = list(range(1,100))
    # 繪制前先清空下,以免有舊數據
    self.glwname.clear()
    _glw = self.glwname.addPlot(title='xxx')
    # 繪制線形圖
    _glw.plot(y=mylist, pen=pg.mkPen((0, 0, 0), width=0.8))

 

通過線程讓界面數據顯示變為可控

使用QThread

class mythread(QThread):
    mysignal = pyqtSignal(int)
    def __init__(self):
        self.status = True

    def run(self):
    '''函數名必須命名為run'''
    while self.status:
        ...
        result = get_your_result()
        # 發送信號
    self.mysignal.emit(result)

 

然后在main.py的main類中添加對應的處理
在你覺得合適的地方構建兩者的關聯,以下代碼在main.py的main類中編寫

self.myTh = mythread()
self.myTh.mysignal.connect(self.my_func)
def my_func(self):
  # 收到對應信號后即會開始執行下方函數
  self.glwname_show_on_layout()
 

想要讓線程開始,可以通過按鈕去start線程

@pyqtSlot()
def on_startbutton_clicked(self):
  self.myTh.start()

想要結束線程,也可以通過按鈕去關閉

@pyqtSlot()
def on_stopbutton_clicked(self):
  self.myTh.status = False
  self.myTh.quit()

 

小結

總得來說,pyQt用來創建桌面程序整體來說還算合格,但對於測試人員來說,實際上過於雞肋,因此建議只是了解,無需深究
以上僅為個人愚見,如有冒犯,還請見諒

以下即為通過pyQt實現的程序

附:如何用python進行exe打包
首先安裝pyinstaller
在腳本所在目錄cmd執行

pyinstaller -F -i 圖標 -w 主文件 -p 關聯文件1 -p 關聯文件2 -p 關聯文件3 #此指令生成的exe無cmd
pyinstaller -F -i 圖標 -c 主文件 -p 關聯文件1 -p 關聯文件2 -p 關聯文件3 #此指令生成的exe帶cmd

 

如果遇到生成單個無cmd的exe,運行exe后無法調用到計算機cmd情況,請生成自帶cmd的exe,不過這樣會大幅度增加程序打開的時間,暫時未找到更好的解決方案


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM