PyQt5利用Qt Designer實(shí)現(xiàn)簡(jiǎn)單界面交互
準(zhǔn)備工作:配置好PyQt5相關(guān)的庫、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)文章
C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)
實(shí)現(xiàn)順序表的插入,刪除,查找,輸出操作在C語言中經(jīng)常用到。下面小編給大家整理實(shí)現(xiàn)代碼,一起看下吧2016-08-08
C++ Boost庫中Chrono時(shí)間模塊的基本使用示例詳解
BoostChrono庫操作詳解,涵蓋基本概念、常用的類型與操作示例,這篇文章給大家介紹C++ Boost庫中Chrono時(shí)間模塊的基本使用示例,感興趣的朋友跟隨小編一起看看吧2026-05-05
深入C++實(shí)現(xiàn)函數(shù)itoa()的分析
本篇文章是對(duì)C++實(shí)現(xiàn)函數(shù)itoa()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
visual?studio?將編譯后的dll等文件自動(dòng)復(fù)制到指定目錄的方法
這篇文章主要介紹了visual?studio?將編譯后的dll等文件自動(dòng)復(fù)制到指定目錄,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03
CMake 生成靜態(tài)庫與動(dòng)態(tài)庫的方法步驟
本文主要介紹了CMake 生成靜態(tài)庫與動(dòng)態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

