Python图形用户界面(GUI)之PyQt6入门及转换视频格式示例

        上篇文章中学习的wxPython用户界面,没有拖拽组件等操作,不是很方便,下面来看个更加强大的GUI==>PyQt系列,拥有拖拽组件界面,这样设计界面就显得非常简单与方便了。Qt库由 Riverbank Computing开发,是最强大的GUI库之一 ,同样也是可以跨平台运行。

安装PyQt6

安装比较简单,建议习惯带上镜像地址,下载速度非常快。

pip install PyQt6 -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

我们来测试下PyQt6的安装是否成功:

import sys
from PyQt6 import QtWidgets

app = QtWidgets.QApplication(sys.argv)
win = QtWidgets.QWidget()
win.resize(400,400)
win.setWindowTitle("寅恪光潜")
win.show()
sys.exit(app.exec())

发现报错了,不能引入这个类型
RuntimeError: PyQt6.QtWidgets cannot import type '�bz��' from PyQt6.QtCore、

我这里安装的时候没有指定版本,现在重装,确保两者版本一致

pip uninstall PyQt6
pip uninstall PyQt6-tools
pip install PyQt6==6.0.2 PyQt6-tools==6.0.2.3.2 -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

再次测试就没有问题了,所以这里对版本有一致的要求,故指定版本号来下载

安装PyQt6-tools

安装好了之后,我们需要找到designer.exe(图形界面开发工具Qt Designer),不过在PyQt5之后就没有直接提供了,需要自行安装,同样使用pip安装,推荐带上镜像地址

pip install  PyQt6-tools -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

个人建议安装在虚拟环境中,比如本人的地址:

activate myd2l
(myd2l) C:\Users\Tony>
#然后在这个里面去找Qt设计师
D:\Anaconda3\envs\myd2l\Lib\site-packages\qt6_applications\Qt\bin\designer.exe

双击打开designer看下是个什么界面:

这个界面就是QT设计师的界面,里面有各种组件随你拖拽,然后我们创建一个窗口,加点东西,保存下,看到后缀是.ui的文件,也就是用户界面文件的意思

.ui界面

上面的界面我们保存为tony.ui文件,我在里面加了文本输入框和按钮,然后打开ui文件可以看到里面是xml格式的内容:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>90</y>
      <width>55</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>用户名</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>190</y>
      <width>75</width>
      <height>24</height>
     </rect>
    </property>
    <property name="text">
     <string>登录</string>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>90</y>
      <width>113</width>
      <height>20</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit_2">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>140</y>
      <width>113</width>
      <height>20</height>
     </rect>
    </property>
    <property name="echoMode">
     <enum>QLineEdit::Password</enum>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>140</y>
      <width>55</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>密   码</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>22</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>寅恪光潜</string>
    </property>
   </widget>
   <addaction name="menu"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

.ui转.py

这种界面文件要应用到Python中,我们需要把它转成.py格式文件,通过如下命令:

python -m PyQt6.uic.pyuic tony.ui -o tony.py

转成功之后,将生成一个tony.py,然后我们打开之后,在其代码最后加上以下代码即可: 

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

原来的ui转换之后的代码如下[也就是Ui_MainWindow这个class是我们通过pyuic将ui界面生成的python代码]

tony.py

# Form implementation generated from reading ui file 'tony.ui'
#
# Created by: PyQt6 UI code generator 6.0.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.

from PyQt6 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 400)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 90, 55, 16))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(120, 190, 75, 24))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(140, 90, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(140, 140, 113, 20))
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 140, 55, 16))
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "用户名"))
        self.pushButton.setText(_translate("MainWindow", "登录"))
        self.label_2.setText(_translate("MainWindow", "密   码"))
        self.menu.setTitle(_translate("MainWindow", "寅恪光潜"))

这种自动生成的代码,不要去编辑,也不需要编辑,因为界面的修改,再次生成时,会自动覆盖原来的代码,所以我们另外写代码,不要在自动生成的代码里面去写。
我们新建一个tonytest.py文件,界面代码和自己写的代码分开来,便于后期修改。

tonytest.py

from tony import Ui_MainWindow
from PyQt6 import QtCore, QtGui, QtWidgets
import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

导入来自tony.py里的Ui_MainWindow类即可

绑定事件

我们来点击“登录”按钮,调用一个方法看看效果怎么样,我们重新写一个class来实现界面需要的逻辑,这个跟做Web开发一个道理,设计的负责界面的设计,需要实现的功能就交给逻辑代码来处理,各自分工。

from tony import Ui_MainWindow
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QMessageBox
import sys


class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent=parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.btnClicked)  # 登录按钮点击绑定事件

    def btnClicked(self):
        msg = f'Hello {self.sender().text()}'
        self.statusBar().showMessage(msg)
        QMessageBox.information(self, 'hi', msg)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MyWindow = MyWindow()
    MyWindow.show()
    sys.exit(app.exec())

可以看到,点击登录按钮之后,将在状态栏显示信息和弹出框显示自定义信息。如下图:

视频格式转换为mp4

我们来做一个视频转换的小栗子,将一些常见的视频格式转成mp4:
界面设计好了之后,将video.ui界面文件转成python文件video.py:

python -m PyQt6.uic.pyuic video.ui -o video.py

然后写逻辑代码如下,导入上面生成的video.py里面的库:

from video import Ui_MainWindow
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QFileDialog,QMessageBox
import sys,os,datetime


class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent=parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.btnClicked)
        self.pushButton_2.clicked.connect(self.btnChangeMP4)

    def btnClicked(self):
        file_name = QFileDialog.getOpenFileName(self, "选择视频", "./", "视频 (*.mkv *.rmvb *.avi)")
        self.fname= file_name[0]
    
    def btnChangeMP4(self):
        newfname=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
        os.system('ffmpeg -i '+self.fname+' -c copy '+newfname+'.mp4')
        QMessageBox.information(self, 'hi', '格式转换成功')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MyWindow = MyWindow()
    MyWindow.show()
    sys.exit(app.exec())

可以看出转换视频,我这里做了两步
第一步使用QFileDialog.getOpenFileName获取选择的视频文件名称
第二步使用系统的命令行,利用ffmpeg来做视频转换。


好了,到这里我想大家对这个PyQt还是有了清晰的了解了吧。

其中需要使用到ffmpeg,点击下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅恪光潜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值