程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python QtGUI與數據可視化編程(一)想寫GUI程序?來試試Python Qt吧!

編輯:Python

作者簡介:大家好我是五維星空,目前是某國企的一名Java全棧程序員,熱愛技術、喜歡代碼,希望我的文章能給大家帶來收獲。

個人主頁:五維星空的csdn博客

系列專欄:Python QtGUI與可視化編程

如果覺得博主的文章還不錯的話,請三連支持一下博主哦!
或微信搜索“五維星空”關注我吧~
參考書目:《Python QtGUI與數據可視化編程》

1. PyQt開發環境搭建

1.1 Python安裝

點擊鏈接直接下載Python3.10版本:https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe

下載太慢?微信搜索“五維星空”,發送“python安裝包”獲取網盤下載地址。

下載後雙擊啟動安裝程序即可(記得勾選add to path)。

1.2 PyQt5安裝

打開cmd執行pip3 install pyqt5

又慢?換源大法送上。如下命令是替換為中科大的源。

pip install pip -U #升級
pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/ #換源

1.3 Qtdesigner安裝

這個東西主要是用來設計界面的,沒錯,就是拖拽控件生成界面,之後執行命令將其轉換成Python代碼。(喜歡手敲的大佬可以跳過這個工具,over~)

點擊鏈接直接下載Qtdesigner Windows版本:https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe

又又又慢?微信搜索“五維星空”,發送“QtDesigner安裝包”獲取網盤下載地址。

下載後雙擊啟動安裝程序即可。

2. PyQt開發基礎

2.1 第一個程序——HelloWorld

基礎不牢、語法不會?**問題不大。毛主席都說了,實踐是檢驗真理的唯一標准。**來寫一個HelloWorld吧

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':
# 創建APP
app = QtWidgets.QApplication(sys.argv)
# 創建窗體
mainFrame = QtWidgets.QWidget()
# 設置窗體大小
mainFrame.resize(800, 200)
# 設置窗體標題
mainFrame.setWindowTitle("HelloWorld")
# 將Label組件綁定到mainFrame上,並設置內容
labelHello = QtWidgets.QLabel(mainFrame)
labelHello.setText("Hello World!By 五維星空~")
# 設置字體
font = QtGui.QFont()
# 字體加粗
font.setBold(True)
# 字體大小
font.setPixelSize(26)
labelHello.setFont(font)
# 計算Label的合適大小並返回QSize對象
size = labelHello.sizeHint()
# 設置labelHello的坐標以及寬高
labelHello.setGeometry(250, 100, size.width(), size.height())
# 運行時顯示對話框
mainFrame.show()
# 啟動應用程序
sys.exit(app.exec_())

運行結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nkfS12K4-1655217489235)(D:\WorkSpace\markdown\書\image\image-20220604100945081.png)]

2.2 使用QtDesigner設計窗體

​ 在2.1節我們一起寫了一個簡單的HelloWorld程序(沒搞懂?問題不大,後面敲著敲著就懂了),本節我們使用QtDesigner來做同樣的事情。在此之前,我們先通過下面這幅圖簡單了解一下QtDesigner的界面。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-THJKQHan-1655217489236)(D:\WorkSpace\markdown\書\image\image-20220604104550848.png)]

好了,接下來正式開始本節的內容。

  1. 打開QtDesigner,按照下圖創建程序。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mGwE7yey-1655217489237)(D:\WorkSpace\markdown\書\image\image-20220604101808796.png)]

  2. 找到windowTitle屬性,輸入窗口標題

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9yLICjgD-1655217489237)(D:\WorkSpace\markdown\書\image\image-20220604101951714.png)]

  3. 找到Label組件,拖拽至窗體位置

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RFmrZ1b1-1655217489238)(D:\WorkSpace\markdown\書\image\image-20220604102127120.png)]

  4. 雙擊進入編輯模式,輸入HelloWorld! By 五維星空~,調整至合適大小。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4Cz3dnTc-1655217489238)(D:\WorkSpace\markdown\書\image\image-20220604102301486.png)]

  5. 在右側對象浏覽器中選中label,之後在屬性編輯器中找到font屬性,選擇合適的字體(咳咳,商用注意小心字體侵權~),設置字體大小後記得調整Label大小。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KAt4FsUG-1655217489239)(D:\WorkSpace\markdown\書\image\image-20220604102742568.png)]

    可以商用的字體(口水話安排上:搜索結果來自互聯網,“五維星空”不對該結果的准確性負責~):

    1. 思源字體,可以免費商用的有:思源黑體,思源宋體,思源柔黑體。

    2. 方正字體,方正類字體可以免費商用的有:方正仿宋(簡,繁),方正黑體(簡,繁),方正楷體( 簡繁),方正書宋(簡,繁)。

  6. 額,忘了調整窗體大小,補上補上~

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oLisKWoZ-1655217489240)(D:\WorkSpace\markdown\書\image\image-20220604103331425.png)]

  7. 調整Label大小

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IIZ9KZQR-1655217489240)(D:\WorkSpace\markdown\書\image\image-20220604103717693.png)]

  8. Ctrl+S保存生成helloWorld.ui文件即可。

  9. helloWorld.ui文件目錄下打開cmd,輸入pyuic5 -o ui_HelloWorld.py helloWorld.ui回車後生成python文件。

    pyuic5是PyQt5的工具軟件,在1.2小節安裝PyQt5的時候它已經安裝在D:\Software\Python310\Scripts路徑下(注意這是我本地的路徑,你的路徑應該是你的Python安裝位置。)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D5sJ9r4Y-1655217489241)(D:\WorkSpace\markdown\書\image\image-20220604105000176.png)]

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OrtZ4Slc-1655217489241)(D:\WorkSpace\markdown\書\image\image-20220604105056282.png)]

    常見問題:

    1. pyuic5報命令不存在?

      小老弟,是不是忘了加環境變量?添加之後記得重啟cmd窗口。

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TBGFwt20-1655217489242)(D:\WorkSpace\markdown\書\image\image-20220604105612257.png)]

    2.3 使用QtDesigner設計的界面

    ​ 在2.1節我們使用QtDesigner生成了一個HelloWorld程序並將它轉換成了python代碼,本節我們來學習如何使用這份代碼。是不是有小伙伴已經運行代碼了發現無事發生?不要慌,我們接著往下看。我們先簡單了解一下這份文件的內容。

    # -*- coding: utf-8 -*-
    # Form implementation generated from reading ui file 'helloWorld.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.6
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again. Do not edit this file unless you know what you are doing.
    from PyQt5 import QtCore, QtGui, QtWidgets
    class Ui_Form(object):
    '''注意,此處繼承的是object對象而不是QWidget對象'''
    def setupUi(self, Form):
    '''設置ui的函數,Form為程序最外層的組件容器對象'''
    Form.setObjectName("Form") # 設置Form對象名稱
    Form.resize(800, 200) # 設置大小
    self.label = QtWidgets.QLabel(Form) # 在Form上定義一個Label
    self.label.setGeometry(QtCore.QRect(250, 100, 420, 35)) # 定義Label位置
    font = QtGui.QFont() # 定義字體
    font.setFamily("楷體")
    font.setPointSize(26)
    font.setBold(True)
    font.setWeight(75)
    self.label.setFont(font) # 設置Label字體
    self.label.setTextFormat(QtCore.Qt.AutoText) # 格式化處理
    self.label.setObjectName("label") # 設置Label對象名稱
    self.retranslateUi(Form) # 自定義方法
    QtCore.QMetaObject.connectSlotsByName(Form) # 通過名稱關聯信號與插槽
    def retranslateUi(self, Form):
    '''設置Form的UI屬性'''
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "HelloWorld"))
    self.label.setText(_translate("Form", "HelloWorld! By 五維星空~"))
    

    怎麼樣?是不是跟咱們手寫的代碼很類似,裡面關於信號與插槽部分後面章節會講,大家只需要大致了解這份文件的風格即可(QtDesigner會有一個繼承object的類進行了ui的一些設置)。

    常見的有三種方式使用這份代碼文件。

    1. 方式一:直接法(不推薦)

      import sys
      from PyQt5 import QtCore, QtGui, QtWidgets
      from ui_HelloWorld import Ui_Form
      if __name__ == '__main__':
      app = QtWidgets.QApplication(sys.argv)
      container = QtWidgets.QWidget()
      form = Ui_Form()
      form.setupUi(container) # 將最外層組件容器對象傳入
      container.show()
      sys.exit(app.exec_())
      

      缺點:耦合性太高。

    2. 方式2:多繼承(不推薦)

      import sys
      from PyQt5.QtWidgets import QApplication, QWidget
      from ui_HelloWorld import Ui_Form
      class MyWidget(QWidget, Ui_Form):
      """多繼承"""
      def __init__(self):
      # 在多繼承時,super()的得到的是第一個基類,在此處就是QWidget。
      super().__init__() # 調用父類構造函數,創建窗體。
      self.labTip = "多繼承" # 新定義一個變量
      self.setupUi(self) # 將當前類(QWidget的子類)傳入
      self.label.setText(self.labTip) # 設置label內容
      if __name__ == '__main__':
      app = QApplication(sys.argv)
      container = MyWidget()
      container.show()
      sys.exit(app.exec_())
      

      缺點:MyWidget自己的屬性和Ui_Form的屬性混在一起了,不易區分。

    3. 方式3:單繼承(推薦

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    from ui_HelloWorld import Ui_Form
    class MyWidget(QWidget):
    """單繼承"""
    def __init__(self, parent=None):
    super().__init__(parent) # 調用父類構造函數,創建窗體
    self.__ui = Ui_Form() # 創建ui對象
    self.__ui.setupUi(self) # 設置父窗體
    self.labTip = "單繼承" # 自定義屬性
    self.__ui.label.setText(self.labTip) # 設置ui內的屬性
    if __name__ == '__main__':
    app = QApplication(sys.argv)
    container = MyWidget()
    container.show()
    sys.exit(app.exec_())
    

    優點:MyWidget自己的屬性和Ui_Form的屬性易區分。

    字體顯示有問題的小伙伴,請將ui轉的python文件中的font.setPointSize(26)改為font.setPixelSize(26)。QtDesigner中沒有setPixelSize屬性,應該是QtDesigner和python版本不一致問題導致的吧,具體原因沒有深究,有興趣的小伙伴可以評論區討論哦。

我是五維星空,一名Java全棧開發者,熱愛技術,感謝各位大大的點贊、收藏和評論,我們下期再見!

微信搜索“五維星空”關注我吧~

by 五維星空-分享前後端技術


  1. 上一篇文章:
  2. 下一篇文章:
相關文章
    没有相关文章
Copyright © 程式師世界 All Rights Reserved