<Python>PyQt5,多窗口之间参数传递和函数调用

2023-10-26

PyQt5的多窗口之间参数如何传递,函数如何调用?

之前在学习PyQt5的过程中,试着自己编写一个音乐播放器,基本功能实现后,希望添加一个独立的播放列表,然后实现播放列表和播放主界面之间的函数调用(双击播放列表的歌曲,主窗口播放歌曲)。
这虽然是一个简单的问题(对职业程序员来说),但作为一个非专业IT人员,把这些搞清楚也是有点麻烦的,经过在网上查找资料以及实际测试后,终于把问题解决了,至少现在实现了在主窗口和子窗口之间的函数调用以及参数传递。

本文以简化的窗口调用实例来说明:主窗口和子窗口分别有一个QListWidget控件(列表),主窗口有一个按钮,点击后,主窗口列表填入数据(1-5),子窗口也填入相同的数据,并显示窗体。
两个窗体的QListWidget控件,将添加‘双击’响应,即双击主窗口的列表控件中的任意项,主窗口的QTextEdit(文本控件)将显示当前列表项的索引值。
如果在子窗口中双击列表项,其项索引值将同样被传递到主窗口,并显示在QTextEdit中。

在这里插入图片描述
在这里插入图片描述
本例中涉及两个点:
1 是子窗口调用
2 是多窗口函数调用

先看第一个点,PyQt中子窗口调用很简单:
先定义两个窗口类:
主窗口:

class win2(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()

子窗口:
子窗口带了一个参数,用于传递列表数据

class win1(QWidget):
    def __init__(self,lt):
        super().__init__()
        
        self.lt=lt
        
        self.initUI()

窗口的UI布局怎么写就不介绍了,比较简单,后面会将完整代码贴出来。

主窗口调用子窗口:

self.win11=win1(list1)
    def list_loaddata_func(self):
        
        for i in range(5):
            self.qlist.addItem(str(i))
            list1.append(str(i))
            
        self.win11=win1(list1)
        self.win11.show()

先实例化子窗口类,然后显示即可。

子窗口调用主窗口函数:

    def win1_doubleplay(self):
        
        self.ind1=self.qlist.currentRow()
        win22.doubleplay2()

win22是主窗口类的实例化,子窗口中直接调用其函数即可。

完整代码:

import os
import sys
import time
import random
import configparser
import ffmpeg
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *


txt1=''
list1=[]
class win1(QWidget):
    def __init__(self,lt):
        super().__init__()
        
        self.lt=lt
        
        self.initUI()
        
    def initUI(self):
        
        self.btn_show_txt=QPushButton('打印',self)
        self.btn_show_txt.setGeometry(20,100,60,20)
        self.btn_show_txt.clicked.connect(self.show_text_func)
        
        self.label_list=QLabel(self)
        self.label_list.setGeometry(100,20,100,20)
        self.label_list.setText('子窗口列表数据:')
        
        self.qlist=QListWidget(self)
        self.qlist.doubleClicked.connect(self.win1_doubleplay)      
        self.qlist.setGeometry(100, 40, 300, 120)
        
        self.list_add()
        
        self.setWindowTitle('子窗口')
        self.setGeometry(300,300,450,200)
    
    def list_add(self):
        
          for l in self.lt:
            self.qlist.addItem(l)

    def show_text_func(self):
        
        win22.win1_show2_func()
        
    def win1_doubleplay(self):
        
        self.ind1=self.qlist.currentRow()
        win22.doubleplay2()
       
        
class win2(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        
        self.win11=win1(list1)
        
        self.btn_win1=QPushButton('子窗口',self)
        self.btn_win1.setGeometry(40,40,60,20)
        self.btn_win1.clicked.connect(self.win1_show_func)
        
        #self.label_txt=QLabel(self)
        #self.label_txt.setGeometry(40,100,60,20)
        #self.label_txt.setText('haha')
        
        self.btn_list=QPushButton('导入list',self)
        self.btn_list.setGeometry(40,130,60,20)
        self.btn_list.clicked.connect(self.list_loaddata_func)
        
        self.label_list=QLabel(self)
        self.label_list.setGeometry(120,20,100,20)
        self.label_list.setText('主窗口列表数据:')
        
        self.qlist=QListWidget(self)
        self.qlist.doubleClicked.connect(self.doubleplay)
        #self.qlist.setStyle(QStyleFactory.create('Fusion'))
        self.qlist.setGeometry(120, 40, 200, 120)
        
        self.label_index=QLabel(self)
        self.label_index.setGeometry(350,20,60,20)
        self.label_index.setText('索引值显示:')
        
        self.te_123=QTextEdit(self)
        self.te_123.setGeometry(350,40,200,120)
        self.te_123.setText('')
        
        self.setWindowTitle('主窗口')
        self.setGeometry(100,100,800,600)
        self.show()
        
    def list_loaddata_func(self):
        
        for i in range(5):
            self.qlist.addItem(str(i))
            list1.append(str(i))
            
        self.win11=win1(list1)
        self.win11.show()
       
        
    def win1_show_func(self): 
                      
        self.win11.show()
        
    def win1_show2_func(self):
        print('jjjjj')
        
    def doubleplay(self):
        self.ind2=self.qlist.currentRow()
        self.te_123.setText(str(self.ind2))
        
        #print('db{}'.format(self.ind2))
    def doubleplay2(self):
        self.ind3=self.win11.qlist.currentRow()
        self.te_123.setText(str(self.ind3))
       
@staticmethod  
def show_txt_func(parent=None):
    txt1='win1 haha'
    print(txt1)   
    win22.label_txt.setText('nihao')
        
    
    
        
if __name__ == '__main__':
    
    app=QApplication(sys.argv)
    win22=win2()
    sys.exit(app.exec_())

演示视频:

python窗口间参数传递及函数调用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<Python>PyQt5,多窗口之间参数传递和函数调用 的相关文章

  • 熊猫在移动的数据帧上滚动

    这是一段代码 我不明白为什么在最后一列 rm 5 上 前 4 项得到 NaN 我知道对于 rm 列 前 4 项未填充 因为没有可用数据 但如果我移动列计算 应该进行 不是吗 同样 我不明白为什么 rm 5 列中有 5 个而不是 4 个项目是
  • 在 Tensorflow 中使用队列将数据馈送到网络时分开验证和训练图

    我一直在做大量关于如何使用队列将数据正确输入网络的研究 但是 我在互联网上找不到任何解决方案 目前我的代码能够读取训练数据并执行训练 但无需验证和测试 这里有一些重要的行构成了我的代码 images volumes utils inputs
  • Xgboost:bst.best_score、bst.best_iteration 和 bst.best_ntree_limit 有什么区别?

    当我使用 xgboost 训练我的数据时2 cates classification problem 我想使用提前停止来获得最佳模型 但我对在预测中使用哪一个模型感到困惑 因为提前停止将返回 3 个不同的选择 例如 我应该使用 preds
  • Python 是否有与 PHP 函数 htmlspecialchars() 等效的函数?

    Python 中是否有与 PHP 函数 htmlspecialchars 类似或等效的函数 到目前为止我发现的最接近的是htmlentitydefs entitydefs 我所知道的最接近的是cgi escape http docs pyt
  • python 函数中的任意数量的参数

    我想学习如何在 python 函数中传递任意数量的参数 所以我以递归方式编写了一个简单的 sum 函数 如下所示 def mySum args if len args 1 return args 0 else return args 1 m
  • 为什么playsound函数无法在python中播放我的mp3文件

    所以基本上我试图创建一个音乐播放程序 可以在您要求时播放音乐 我只是想让歌曲播放部分实际工作 所以我编写了一个超级简单的代码来测试它 import playsound playsound sample mp3 This was done i
  • Python/pandas:从两个数据帧中查找匹配值并返回第三个值

    我有两个不同的数据帧 df1 df2 具有完全不同的形状 df1 64 6 df2 564 9 df1 包含一列 df1 objectdesc 其中的值 字符串 也可以在 df2 df2 objdescription 的列中找到 由于两个数
  • dask groupby 不合并分区

    我有一组数据 我想要对其进行一些简单的 groupby count 操作 但我似乎无法使用 dask 来完成此操作 我很可能不理解 dask 中执行 groupby reduce 的方式 特别是当索引位于分组键中时 所以我将用玩具数据来说明
  • 打开文件对象的大小

    有没有办法找到当前打开的文件对象的大小 具体来说 我正在使用 tarfile 模块来创建 tarfile 但我不希望 tarfile 超过特定大小 据我所知 tarfile 对象是类似文件的对象 所以我想通用的解决方案会起作用 ls la
  • Python 中函数未定义错误

    我试图在 python 中定义一个基本函数 但当我运行一个简单的测试程序时 我总是收到以下错误 gt gt gt pyth test 1 2 Traceback most recent call last File
  • 没有名为“_pywrap_tensorflow_internal”的模块

    在尝试验证tensorflow gpu的安装时 在尝试执行 import tensorflow as tf 时出现ImportError 我在 Windows 7 上使用 Quadro K620 Tensorflow 是使用 pip 安装的
  • 如何将目录结构解析为字典?

    我有目录结构列表 例如 a b a b c a b c d a b c e a b c f g a b c f h a b c f i 我想将它转换成像树结构一样的字典 a b c d None e None f g None h None
  • 无需重新计算即可获取字典键哈希

    有没有办法从字典中提取现有的密钥哈希 而无需再次重新计算它们 暴露它们并因此通过哈希而不是密钥访问字典会有什么风险 我认为 Python 的字典对象没有任何公共 API 可以让您查看存储其对象的哈希值 您无法在 Python 代码中直接通过
  • 计算具有不均匀间隔点的 3D 梯度

    我目前有一个由几百万个不均匀间隔的粒子组成的体积 每个粒子都有一个属性 对于那些好奇的人来说是潜力 我想计算其局部力 加速度 np gradient 仅适用于均匀分布的数据 我在这里查看 numpy 中的二阶梯度 https stackov
  • 使用变量访问 Django 模板中的字典元素

    情况如下 我们渲染一个视图 return render request test html db object db object dict dict 在模板中 我们现在想要访问字典db object key 在Python中你通常会这样做
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • 识别输入的数据类型

    我正在尝试打印用户输入的数据类型并生成如下表 ABCDEFGH String 1 09 float 0 int true bool etc 我正在使用 Python 3 2 3 并且我知道我可以使用type 获取数据的类型 但在Python
  • 减小散点图的文件大小

    我目前正在尝试减小散点图的文件大小 我的代码如下所示 plt scatter a1 b1 plt savefig test ps 其中 a1 b1 是大小为 400 000 左右的数组 它给出的文件大小为 7 8MB 我尝试过添加 plt
  • 根据另一个 csv 文件过滤 csv 文件中的行并将过滤后的数据保存在新文件中

    大家好 所以我试图根据file1过滤file2 其中file1是file2的子集 但 file2 有一个描述列 我需要能够分析 file1 中的数据 我想做的是过滤 file2 并仅获取 file1 中的标题及其描述 我尝试了这个 但我不太
  • 根据 pandas 中其他数据帧的值更改一个数据帧的值

    我有一个数据框 df1 id value 1 100 2 100 3 100 4 100 5 100 我有另一个数据框 df2 id value 2 50 5 30 我想用 df1 中的值替换 df2 中 id 的这些值 最终修改后的df1

随机推荐

  • TCP 多线程——一个服务器被多个客户端连接

    为了使一个服务器端能被多个客户端连接我们采用线程的方法 服务器创建一个线程之后 打开的套接字就被线程所继承 线程可以和连接的客户进行通信 而主线程 主服务器 可以继续接受以后的客户连接 即Accept之后产生一个c 然后将c传递给新创建线程
  • Visual C++ 2008 Feature Pack 开发包

    http download csdn net detail fandh 1018063 Visual C 2008 Feature Pack 开发包
  • 使用 Skeleton Screen 提升用户感知体验

    1024程序猿节 愿世界和平 没有bug 腾讯云社区向改变世界的程序猿致敬 作者 陈纬杰 一直以来 无论是web还是iOS android的应用中 为了提升应用的加载等待这段时间的用户感知体验 各种奇门遁甲之术层出不穷 其中 菊花图以及由它
  • 【满分】【华为OD机试真题2023 JAVA&JS】硬件产品销售方案

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 硬件产品销售方案 知识点递归数组DFS搜索回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某公司目前推出了AI开发者套件 AI加速卡 AI加速模块 AI服务
  • 可以改动的option组件_MySQL的validate_password插件/组件总结

    Password Validation插件和组件 在MySQL 8 0之前 MySQL使用的是validate password插件 plugin 检测 验证账号密码强度 保障账号的安全性 而到了MySQL 8 0 引入了服务器组件 Com
  • c高级 day4

    实现一个对数组求和的函数 数组通过实参传递给函数 bin bash read p 请输入数组 a arr function sum sum 0 for i in arr do sum sum i done echo 数组和 sum sum
  • ubuntu nginx服务器安装SSL证书

    证书安装 前往 SSL 证书管理控制台中下载 SSL 证书 名称以 bdjw work 为例 文件压缩包 并解压到本地目录 解压缩后 可获得相关类型的证书文件 文件内容 bdjw work bundle crt 证书 bdjw work k
  • MySQL 高级原理: MySQL执行过程及执行顺序

    一 MySQL执行过程 MySQL整体的执行过程如下图所示 1 1 连接器 1 1 1连接器的主要职责 1 负责与客户端的通信 是半双工模式 这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据 而不能同时进行 其中My
  • 文件的打开与关闭

    对于文件的打开与关闭 我们可以通过鼠标来控制 但是 在我们写代码的时候 总不能来用鼠标来打开关闭文件 并且还能将代码放在那个文件里面吧 因此 我们需要一个文件指针来帮助我们来打开和关闭文件 1 文件指针 缓冲文件系统中 关键的概念是 文件类
  • Ubuntu命令行修改网络配置,静态ip,hostname ,解决hostname ping不通的办法

    打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo vi etc network interfaces 并用下
  • Ms08067漏洞复现

    Ms08067漏洞复现 首先安装好测试环境xp的镜像文件 nmap扫描 首先确定靶机所在的网段 然后在kali中利用命令扫描出IP nmap sP 192 168 229 0 24 得到 IP 192 168 229 168 其次在利用nm
  • 字节、字、位、比特的概念和关系

    1 位 bit 来自英文bit 音译为 比特 表示二进制位 位是计算机内部数据储存的最小单位 11010100是一个8位二进制数 一个二进制位只可以表示0和1两种状态 21 两个二进制位可以表示00 01 10 11四种 22 状态 三位二
  • 如何避免服务器被恶意网络攻击

    服务器的IP是可公开透明的 很容易遭到黑客入侵或网络攻击 对服务器的恶意网络行为包括两个方面 首先是恶意的攻击行为 如DDoS攻击 网络病毒等等 这些行为旨在消耗服务器资源 影响服务器的正常运作 甚至服务器所在网络的瘫痪 另外一个就是恶意的
  • STM8L151的IAR工程编译报错Fatal Error[Pe035]: #error directive: “Please select first the target STM8L...

    项目场景 STM8L151G4XX单片机IAR工程编译报错 问题描述 编译报错 Fatal Error Pe035 error directive Please select first the target STM8L device us
  • token的使用流程以及 JWT构成和构建

    1 什么是token token是一个令牌 是前后端开发时的一个验证工具 就是一个字符串 我们先解释一下他的含义 1 Token的引入 Token是在客户端频繁向服务端请求数据 服务端频繁的去数据库查询用户名和密码并进行对比 判断用户名和密
  • Linux的诞生和发展&开源模式的流行

    Linux的诞生和发展 Linux的诞生 1991年最初由Linus Torvalds针对386 个人计算机 开发 Linus Torvalds那时是芬兰的一名研究生 20世纪80年代 计算机硬件的性能不断提高 PC的市场不断扩大 当时可供
  • axivion和astree_Axivion架构分析及验证工具

    德国Axivion公司 德国Axivion 公司是一家完全自主的技术公司 公司保持持续增长 在软件开发解决方案领域拥有超过10年的经验 作为源于斯图加特大学的公司 Axivion公司提供了一个良好的学术背景 开发专业完整的解决方案 以确保软
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 只要这铃声响起 100个人得有10个人掏出手机看看 当之无愧的山寨歌王 当IPhone变成街机 出厂铃声数量不多 铃声总是撞车 DIY个性铃声很有必要的 只要不选择 月亮之上 就没问题 IPhone设置铃声的方
  • IDEA 打war包部署时子模块jar包没依赖上

    使用IDEA在tomcat中部署maven多模块时出现的一个莫名的bug 首先在server中打印下 可以看见 context startup failed due to previous error see server log for
  • <Python>PyQt5,多窗口之间参数传递和函数调用

    PyQt5的多窗口之间参数如何传递 函数如何调用 之前在学习PyQt5的过程中 试着自己编写一个音乐播放器 基本功能实现后 希望添加一个独立的播放列表 然后实现播放列表和播放主界面之间的函数调用 双击播放列表的歌曲 主窗口播放歌曲 这虽然是