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

news2025/2/26 9:58:09

        上篇文章中学习的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,点击下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】版本控制器Git

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;Git概述&a…

Pytorch~单卡改多卡

搬来了这个,这是尝试单卡改多卡加速的过程中出现的bug记录&#xff1a;一是继承DistributedSampler的漏洞百出&#xff0c;二是master进程无法正常结束&#xff0c;这里详细的阐述了出错的细节以及给出了修改的方法。 先说明一下背景&#xff0c;目前正在魔改以下这篇论文的代…

JavaScript 中事件循环(eventloop)、垃圾回收机制、闭包、递归函数的理解及示例

事件循环(eventloop) 概念 js 是单线程&#xff0c;为防止阻塞代码&#xff0c;把同步代码交给 js 引擎执行 异步代码交给宿主环境&#xff0c; 同步代码放入执行栈中 异步代码等待时机送入任务队列中&#xff0c; 执行栈执行完毕 会去任务队列看是否有异步任务 有就送到执行…

Postman核心功能解析-参数化和测试报告

参数化处理 参数化&#xff1a;针对于某一个接口&#xff0c;有大量的的测试数据需要批量验证&#xff0c;一个一个的更改请求参数太耗时耗力&#xff0c;使用参数化批量处理数据会比较高效&#xff0c;常规通过文档参数化实现。 创建文件 格式CSV 文件内第一行信息 需要和参数…

谈谈转行数据分析以及工作的心得

由于两个月前写了一篇文章叫《自己找数据分析师时犯的错误》&#xff0c;然后这期间就一直有人问我找到工作了吗&#xff1f;面试的时候&#xff0c;面试官都是问你的什么呢&#xff1f;你从事数据分析工作之后主要干什么呢&#xff1f;所以想在这里为大家分别解答下。 首先回…

【Linux】编译器gcc / g++的使用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;gcc / g的…

快速玩转ChatGPT全攻略

本文内容&#xff1a; 准备工作。 注册接嘛平台。 注册OpenAI账号。 开始畅聊。 一.准备工作&#xff1a; Proxy&#xff0c;美国&#xff0c;日本&#xff0c;韩国&#xff0c;新加坡&#xff0c;印度&#xff0c;不能用香港。 Chrome浏览器。 二、注册接嘛平台&#x…

在ARM微控制器上部署MATLAB/Simulink仿真模型

在ARM微控制器上部署MATLAB/Simulink仿真模型 苏勇&#xff0c;suyong_yq126.com&#xff0c;2022年12月 文章目录在ARM微控制器上部署MATLAB/Simulink仿真模型IntroductionOverviewMATLAB、Simulink、StateFlow、Real-Time Workshop之间的关系MATLAB Coder、Simulink Coder、…

最新版Android原生集成RN

前言 现在不少应用都是采用了混合开发模式&#xff0c;不论是原生加RN,或是原生加Flutter,或是原生加H5。原生实现主业务线&#xff0c;其他部分可以借助跨平台方案开发&#xff0c;提高开发效率&#xff0c;或者实现热更新&#xff0c;调高业务迭代效率。 下面简单介绍一下A…

如何调整参数来更好地使用频谱分析仪

前言 使用频谱分析仪&#xff0c;最简单最直观的目的就是寻找并观测范围内的频谱信号&#xff0c;乃至将其保存下来做更进一步的数字处理或分析。因此在除了最基本的中心频率与扫宽设置外&#xff0c;合理使用VBW,RBW等参数设置才能获取更为真实准确的信号。 图一 合理调整参数…

Diffusion Model合集 part3

扩散模型原理介绍3八&#xff0c;Diffusion Probabilistic Model的算法代码而我们可以有多种建模目标&#xff1a;Lt−1Eq[12σt2∣∣μt∼(xt,x0)−μθ(xt,t)∣∣2]CL_{t-1}\mathbb{E}_{q}\left[\frac{1}{2\sigma_{t}^{2}}||\overset{\sim}{\mu_{t}}(\mathbf{x}_{t},\mathbf{…

系统调用(Linux)

目录 1.内核态和用户态&#xff1a; 1.1CPU的两种状态&#xff1a; 1.2CPU 指令集权限&#xff1a; 1.3用户态与内核态的空间&#xff1a; 1.4用户态与内核态的切换&#xff1a; 2.系统调用&#xff1a; 2.1linux框架图&#xff1a; 2.2系统调用和API&#xff1a; 2.3系…

The release Method

The release Method The role of the release method is the reverse of open. Sometimes youll find that the method implementation is called device_close instead of device_release. Either way, the device method should perform the following tasks: 释放方法的作用…

跟我学 UML 系统建模

UML 系统建模 1 概述 1.1 课程概述 汇集 UML 及其相关的一些话题回顾 UML 相关的符号与概念以电商订单相关业务为例&#xff0c;借助 UML 完成系统建模将 UML 变成提升建模效率&#xff0c;表达架构思想的工具 1.2 什么是 UML ​ Unified Modeling Language 统一建模语言&a…

Leetcode-1753-移除石子的最大得分

1、堆 我们可以维护一个大顶堆&#xff0c;其中储存了三个石子堆中石子的个数。为了确保我们的分数尽可能大&#xff0c;我们每次都需要从最大的两个堆中取出石子。因此我们不断循环&#xff0c;每次都从当前最大的堆中取出石子。值得注意的是&#xff0c;为了确保能够发现游戏…

数据管理篇之存储和成本管理

第14章 存储和成本管理 目标&#xff1a;有效的降低存储资源的消耗&#xff0c;节省存储成本。 1.数据压缩 问题 在分布式文件系统中&#xff0c;为了提高数据的可用性与性能 &#xff0c;通常会将数据存储3份&#xff0c;这就意味着存储 1TB 的逻辑数据&#xff0c; 实际上…

iOS自动化真机测试验证环境过程中常见问题解析

本文节选自霍格沃兹测试学院内部教材 本章节主要讲解 iOS 自动化真机配置以及在 iOS 真机执行自动化时常见问题与解决方法。 真机使用的Capability 与模拟器不同&#xff0c;真机测试需要如下的 Capability 方式一&#xff1a;设置 App 路径&#xff0c;启动 App&#xff08;自…

SpringBoot项目开启远程调试

1、服务端设置 cat start.sh #!/bin/bash echo "i will start the program!" java -jar -Xdebug -Xrunjdwp:transportdt_socket,servery,address9999 xxxxx-SNAPSHOT.jar --server.port10991 echo "start success" 2、开发工具设置 3、然后&#…

计算机网络~计算机网络体系结构

一、计算机网络的概念和功能 1. 计算机网络 是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统计算机网络是互联的、自治的计算机集合 互联&#xff1a;通过通信链路互联互通自治&a…

π120M30 双通道数字隔离器兼容ADuM3210TRZ 广泛应用于工业自动化系统方案

π120M30 双通道数字隔离器兼容ADuM3210TRZ 广泛应用于工业自动化系统方案 。具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kV rms 隔离耐压等级和 …