PyQt5利用Qt Designer實(shí)現(xiàn)簡(jiǎn)單界面交互
準(zhǔn)備工作:配置好PyQt5相關(guān)的庫(kù)、QtDesigner、pyuic
1 QtDesigner簡(jiǎn)單界面設(shè)計(jì)
點(diǎn)擊“工具"——>“外部工具(External Tools)”——>“QtDesigner”。
進(jìn)入程序之后,點(diǎn)擊“創(chuàng)建”,創(chuàng)建一個(gè)新的ui文件。
進(jìn)入設(shè)計(jì)界面之后,將“按鈕”控件拖放到主窗口的合適位置。
(用于響應(yīng)用戶的交互動(dòng)作,比如點(diǎn)擊、按下或釋放)
將“單行文本”控件拖放到主窗口的合適位置。
(用于單行文本輸入的控件,它允許用戶在界面上輸入和編輯文本)
將“多行文本編輯器”控件拖放到主窗口的合適位置。
(與 QLineEdit 控件不同,它允許用戶輸入和編輯多行文本內(nèi)容)
將“窗口(這里用于繪圖)”控件拖放到主窗口的合適位置。
(用于繪制、事件處理和布局管理,提供了基本的 GUI 功能。)
將控件進(jìn)一步添加如下圖所示,添加“按鈕”和“標(biāo)簽”,并改變文本內(nèi)容。
在右側(cè)的“對(duì)象查看器”中可以看到當(dāng)前所添加的所有控件的名稱和相應(yīng)的屬性內(nèi)容。
將ui文件保存到文件夾中(后續(xù)代碼文件也放在這個(gè)文件夾里)
2 代碼部分
2.1 ui文件轉(zhuǎn)py文件
轉(zhuǎn)換方法有兩種,一種是用External Tools轉(zhuǎn)換,一種是用專門的代碼去轉(zhuǎn)換。(兩種方法的前提是要配置好pyuic)
- 方法一(External Tools外部工具欄)
(1)在Pycharm左側(cè)項(xiàng)目欄中找到剛剛存放ui文件的文件夾,打開文件夾后,將ui文件拖放到右側(cè)打開。
(2)點(diǎn)擊“工具"——>“外部工具(External Tools)”——>“PyUIC”。
點(diǎn)擊之后可以看到左側(cè)文件夾中生成了相應(yīng)的py文件,轉(zhuǎn)換成功!
- 方法二(ui轉(zhuǎn)py專用代碼)
需要注意的是,在運(yùn)行代碼之前,需要把該專用代碼放到和ui文件所在的同一個(gè)文件夾里。
我讓ChatGPT寫了一個(gè)ui轉(zhuǎn)換py專用的代碼,自己轉(zhuǎn)換了一遍,經(jīng)驗(yàn)證放心可用,代碼如下:
import os import subprocess def ui_to_py(ui_file): """Converts a Qt Designer .ui file to a Python .py file in the same directory.""" # Get the base name without extension base_name = os.path.splitext(ui_file)[0] # Construct the output .py file name py_file = base_name + '.py' # Construct the command command = f'pyuic5 -o {py_file} {ui_file}' try: # Run the command subprocess.run(command, check=True, shell=True) print(f'Successfully converted {ui_file} to {py_file}') except subprocess.CalledProcessError as e: print(f'Failed to convert {ui_file} to {py_file}: {e}') if __name__ == "__main__": # Get the current directory current_directory = os.getcwd() # Loop through all files in the current directory for file_name in os.listdir(current_directory): # Check if the file is a .ui file if file_name.endswith('.ui'): # Convert the .ui file to .py file ui_to_py(file_name)
運(yùn)行上述之后可以看到左側(cè)文件夾中生成了相應(yīng)的py文件,轉(zhuǎn)換成功!
2.2 界面文件代碼
下面是轉(zhuǎn)換后的py文件,為了方便,我們后面都叫它界面文件。界面文件中有控件的具體信息,比如控件尺寸大小、位置、名稱、顯示內(nèi)容等信息。此外,我們還要記住它的類名,以便后續(xù)主文件的類進(jìn)行繼承。
轉(zhuǎn)換后的完整py文件代碼如下:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file '0622test.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # 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_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(791, 593) #主窗口大小 self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") #主窗口名稱 self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(80, 90, 89, 27)) #按鈕大小和在主窗口中的位置 self.pushButton.setObjectName("pushButton") #按鈕名稱 self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(210, 90, 113, 20)) #...... self.lineEdit.setObjectName("lineEdit") self.textEdit = QtWidgets.QTextEdit(self.centralwidget) self.textEdit.setGeometry(QtCore.QRect(210, 140, 211, 141)) self.textEdit.setObjectName("textEdit") self.widget = QtWidgets.QWidget(self.centralwidget) self.widget.setGeometry(QtCore.QRect(210, 300, 401, 201)) self.widget.setObjectName("widget") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(80, 190, 89, 27)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(80, 350, 89, 27)) self.pushButton_3.setObjectName("pushButton_3") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(360, 90, 63, 14)) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(450, 200, 63, 14)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(640, 390, 63, 14)) self.label_3.setObjectName("label_3") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 791, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) # 顯示的文本內(nèi)容 self.pushButton.setText(_translate("MainWindow", "按鈕1")) #顯示的文本內(nèi)容 self.pushButton_2.setText(_translate("MainWindow", "按鈕2")) #...... self.pushButton_3.setText(_translate("MainWindow", "按鈕3")) self.label.setText(_translate("MainWindow", "單行文本")) self.label_2.setText(_translate("MainWindow", "多行文本")) self.label_3.setText(_translate("MainWindow", "繪圖"))
2.3 主文件代碼
2.3.1 主體框架代碼
我們先來介紹主體的框架,這是一部分是個(gè)模板,套用的時(shí)候需要需改一下細(xì)節(jié)信息,廢話不多說,先上代碼:
(先前的轉(zhuǎn)換后的py代碼命名不符合規(guī)范,我重命名為了f0622test.py)
import sys from PyQt5.QtWidgets import * from PyQt5.Qt import * from PyQt5.QtCore import * from PyQt5.QtWidgets import QApplication,QMainWindow,QDesktopWidget,QLineEdit from f0622test import * #導(dǎo)入轉(zhuǎn)換后的py文件,要用自己的轉(zhuǎn)換后的py文件的名字,我這里是f0622test.py class MyWindows(QMainWindow,Ui_MainWindow): #繼承自兩個(gè)父類,一個(gè)是QMainWindow,一個(gè)是轉(zhuǎn)換后的py文件的類,這里是Ui_MainWindow def __init__(self): super(MyWindows,self).__init__() self.setupUi(self) #...... if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MyWindows() window.show() sys.exit(app.exec_())
下面對(duì)它們進(jìn)行解釋:
import sys
sys 模塊提供了一系列與 Python 解釋器進(jìn)行交互的功能,包括命令行參數(shù)、標(biāo)準(zhǔn)輸入輸出、錯(cuò)誤流等。from PyQt5.QtWidgets import *
PyQt5.QtWidgets 模塊包含了所有用于創(chuàng)建圖形用戶界面(GUI)的基本控件,如按鈕、標(biāo)簽、文本框等。from PyQt5.Qt import *
PyQt5.Qt 模塊提供了 PyQt 中常用的基本類,包括信號(hào)與槽機(jī)制、事件處理等。from PyQt5.QtCore import *
PyQt5.QtCore 模塊包含了核心的非 GUI 功能,包括事件循環(huán)、信號(hào)與槽、時(shí)間和日期、文件和目錄操作等。from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget, QLineEdit
這些特定的導(dǎo)入用于創(chuàng)建應(yīng)用程序、主窗口、桌面控件和單行文本輸入框。from XAJ1 import *
導(dǎo)入自定義模塊 XAJ1 中的所有內(nèi)容,這通常包含定義的類、函數(shù)和變量。XAJ1 是你項(xiàng)目中的一個(gè)模塊,它可能包含一些特定功能的實(shí)現(xiàn)。類和初始化函數(shù)
class MyWindows(QMainWindow, Ui_MainWindow): def __init__(self): super(MyWindows, self).__init__() self.setupUi(self)
①定義一個(gè)名為 MyWindows 的類,繼承了 QMainWindow 和 Ui_MainWindow。
②在創(chuàng)建 MyWindows 對(duì)象時(shí),調(diào)用父類的構(gòu)造函數(shù)進(jìn)行初始化。
③調(diào)用 Ui_MainWindow 的 setupUi 方法,設(shè)置用戶界面,將所有設(shè)計(jì)好的控件和布局添加到當(dāng)前窗口實(shí)例中。
- 結(jié)尾代碼:判斷當(dāng)前模塊是否被直接執(zhí)行
if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MyWindows() window.show() sys.exit(app.exec_())
①檢查腳本是否被直接運(yùn)行。
②初始化一個(gè) QApplication 對(duì)象。
③創(chuàng)建并初始化主窗口對(duì)象。
⑤顯示主窗口。
⑥啟動(dòng)主事件循環(huán)并運(yùn)行應(yīng)用程序,直到用戶退出。
這些步驟是創(chuàng)建和運(yùn)行任何 PyQt5 應(yīng)用程序所必需的標(biāo)準(zhǔn)流程。其中第一行的代碼經(jīng)常會(huì)用到,這里詳細(xì)解釋:
if __name__ == '__main__':
這行代碼檢查當(dāng)前模塊是否是作為主程序運(yùn)行。name 是一個(gè)特殊變量,當(dāng)模塊被直接運(yùn)行時(shí),其值為 main。如果模塊是被導(dǎo)入的,其值將是模塊的名稱。因此,這行代碼的意思是:只有當(dāng)該腳本被直接運(yùn)行時(shí),下面的代碼塊才會(huì)被執(zhí)行。
2.3.2 實(shí)現(xiàn)交互代碼
下面介紹實(shí)現(xiàn)交互的代碼,首先我們要知道先前我們布置的控件的名稱,有兩個(gè)途徑:①用QtDesigner打開ui文件,在右側(cè)對(duì)象查看器查看。②在轉(zhuǎn)換后的py文件中查看。我們來舉個(gè)例子,比如要知道“按鈕1”的名稱,經(jīng)查看,名稱是pushButton:
途徑①
途徑②
然后我們才能開始對(duì)控件的交互功能進(jìn)行實(shí)現(xiàn)。
下面對(duì)三個(gè)輸出控件(單行文本、多行文本、繪圖窗口)設(shè)置三個(gè)函數(shù),描述其功能:
(1)函數(shù)1
對(duì)應(yīng)LineEdit控件
def function_1 (self): #按鈕1點(diǎn)擊事件 self.lineEdit.setText("2024") #執(zhí)行該函數(shù)時(shí),會(huì)將名稱為lineEdit的控件文本內(nèi)容設(shè)置為2024
(2)函數(shù)2
對(duì)應(yīng)TextEdit控件
def function_2 (self): # 按鈕2點(diǎn)擊事件 a=self.lineEdit.text() # 獲取lineEdit的文本內(nèi)容 a=int(a) # 由于獲取的lineEdit的文本內(nèi)容是字符串,所以要轉(zhuǎn)換為整數(shù) if a == 2024: self.textEdit.setText("Hello World") # 如果lineEdit的文本內(nèi)容為2024,則將textEdit的文本內(nèi)容設(shè)置為Hello World self.textEdit.append("今年是:") # 在textEdit中追加文本,會(huì)在下一行顯示 self.textEdit.append(f"{a}年") # 在textEdit中追加文本,會(huì)在下一行顯示,由于a是整數(shù),所以要轉(zhuǎn)換為字符串
(3)函數(shù)3
對(duì)應(yīng)Widget控件
我們要先在文件開頭導(dǎo)入畫圖相關(guān)的包
from matplotlib.figure import Figure #用來創(chuàng)建圖形,相當(dāng)于畫布 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas #用來將matplotlib的圖形嵌入到PyQt5的窗口中 import matplotlib.pyplot as plt #一般用來繪圖,這里用來調(diào)整中文字體,因?yàn)橐呀?jīng)有了畫圖的FigureCanvas
而后進(jìn)行函數(shù)3的編寫
def function_3 (self): #按鈕3點(diǎn)擊事件 # 創(chuàng)建 FigureCanvas 并嵌入到 QWidget 中 figure = Figure() canvas = FigureCanvas(figure) layout = QVBoxLayout(self.widget) # 我的繪圖窗口名稱叫widget,所以這里是self.widget。 # QVBoxLayout是垂直布局,布局管理器用于管理widget中的控件,這里是FigureCanvas layout.addWidget(canvas) # 將FigureCanvas添加到布局管理器中 # 設(shè)置 matplotlib 使用的字體 plt.rcParams['font.sans-serif'] = ['SimSun', 'Microsoft YaHei'] # 使用宋體和微軟雅黑 plt.rcParams['axes.unicode_minus'] = False # 解決負(fù)號(hào)顯示問題 # 繪制折線圖 x = [1, 2, 3, 4, 5] y = [1, 4, 9, 16, 25] ax = figure.add_subplot(111) ax.plot(x, y, marker='o') ax.set_title("樣例圖") ax.set_xlabel("X軸") ax.set_ylabel("Y軸") ax.grid(True) canvas.draw()
下面進(jìn)行按鈕與相應(yīng)函數(shù)功能的連接:在初始化函數(shù)中添加以下內(nèi)容
self.pushButton.clicked.connect(self.function_1) # 按鈕1點(diǎn)擊事件,連接到function_1函數(shù) self.pushButton_2.clicked.connect(self.function_2) self.pushButton_3.clicked.connect(self.function_3)
完整主文件代碼如下:
import sys from PyQt5.QtWidgets import * from PyQt5.Qt import * from PyQt5.QtCore import * from PyQt5.QtWidgets import QApplication,QMainWindow,QDesktopWidget,QLineEdit from f0622test import * #導(dǎo)入轉(zhuǎn)換后的py文件,要用自己的轉(zhuǎn)換后的py文件的名字,我這里是f0622test.py from matplotlib.figure import Figure #用來創(chuàng)建圖形,相當(dāng)于畫布 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas #用來將matplotlib的圖形嵌入到PyQt5的窗口中 import matplotlib.pyplot as plt #一般用來繪圖,這里用來調(diào)整中文字體,因?yàn)橐呀?jīng)有了畫圖的FigureCanvas class MyWindows(QMainWindow,Ui_MainWindow): #繼承自兩個(gè)父類,一個(gè)是QMainWindow,一個(gè)是轉(zhuǎn)換后的py文件的類,這里是Ui_MainWindow def __init__(self): super(MyWindows,self).__init__() self.setupUi(self) self.pushButton.clicked.connect(self.function_1) # 按鈕1點(diǎn)擊事件,連接到function_1函數(shù) self.pushButton_2.clicked.connect(self.function_2) self.pushButton_3.clicked.connect(self.function_3) #...... def function_1 (self): #按鈕1點(diǎn)擊事件 self.lineEdit.setText("2024") #執(zhí)行該函數(shù)時(shí),會(huì)將名稱為lineEdit的控件文本內(nèi)容設(shè)置為2024 def function_2 (self): # 按鈕2點(diǎn)擊事件 a=self.lineEdit.text() # 獲取lineEdit的文本內(nèi)容 a=int(a) # 由于獲取的lineEdit的文本內(nèi)容是字符串,所以要轉(zhuǎn)換為整數(shù) if a == 2024: self.textEdit.setText("Hello World") # 如果lineEdit的文本內(nèi)容為2024,則將textEdit的文本內(nèi)容設(shè)置為Hello World self.textEdit.append("今年是:") # 在textEdit中追加文本,會(huì)在下一行顯示 self.textEdit.append(f"{a}年") # 在textEdit中追加文本,會(huì)在下一行顯示,由于a是整數(shù),所以要轉(zhuǎn)換為字符串 else: self.textEdit.setText("你好世界") # 如果lineEdit的文本內(nèi)容不是2024,則將textEdit的文本內(nèi)容設(shè)置為輸入錯(cuò)誤 def function_3 (self): #按鈕3點(diǎn)擊事件 # 創(chuàng)建 FigureCanvas 并嵌入到 QWidget 中 figure = Figure() canvas = FigureCanvas(figure) layout = QVBoxLayout(self.widget) # 我的繪圖窗口名稱叫widget,所以這里是self.widget。 # QVBoxLayout是垂直布局,布局管理器用于管理widget中的控件,這里是FigureCanvas layout.addWidget(canvas) # 將FigureCanvas添加到布局管理器中 # 設(shè)置 matplotlib 使用的字體 plt.rcParams['font.sans-serif'] = ['SimSun', 'Microsoft YaHei'] # 使用宋體和微軟雅黑 plt.rcParams['axes.unicode_minus'] = False # 解決負(fù)號(hào)顯示問題 # 繪制折線圖 x = [1, 2, 3, 4, 5] y = [1, 4, 9, 16, 25] ax = figure.add_subplot(111) ax.plot(x, y, marker='o') ax.set_title("樣例圖") ax.set_xlabel("X軸") ax.set_ylabel("Y軸") ax.grid(True) canvas.draw() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MyWindows() window.show() sys.exit(app.exec_())
運(yùn)行主文件代碼,點(diǎn)擊相應(yīng)按鈕即可實(shí)現(xiàn)相應(yīng)功能。
3結(jié)果展示
到此這篇關(guān)于PyQt5利用Qt Designer實(shí)現(xiàn)簡(jiǎn)單界面交互的文章就介紹到這了,更多相關(guān)PyQt5界面交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode配置遠(yuǎn)程開發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程
這篇文章主要介紹了vscode配置遠(yuǎn)程開發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程,本文通過截圖實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C++使用文件實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++使用文件實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01C語(yǔ)言模擬實(shí)現(xiàn)密碼輸入的示例代碼
本文主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)密碼輸入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用,訪問者模式在不破壞類的前提下為類提供增加新的新操作,需要的朋友可以參考下2016-03-03C語(yǔ)言詳解分析進(jìn)程控制中進(jìn)程終止的實(shí)現(xiàn)
當(dāng)進(jìn)程完成執(zhí)行最后語(yǔ)句并且通過系統(tǒng)調(diào)用 exit() 請(qǐng)求操作系統(tǒng)刪除自身時(shí),進(jìn)程終止。這時(shí),進(jìn)程可以返回狀態(tài)值(通常為整數(shù))到父進(jìn)程(通過系統(tǒng)調(diào)用 wait())。所有進(jìn)程資源,如物理和虛擬內(nèi)存、打開文件和 I/O 緩沖區(qū)等,會(huì)由操作系統(tǒng)釋放2022-08-08