pyQt5从dict创建按钮连接到具有附加值的函数

Posted

技术标签:

【中文标题】pyQt5从dict创建按钮连接到具有附加值的函数【英文标题】:pyQt5 create pushbutton from dict connect to a function with add value 【发布时间】:2017-01-26 15:08:48 【问题描述】:

我的按钮连接有问题。我尝试了不同的方式,但我没有到达。有时我的 GUI 不显示,存放在缓冲区中。 有时我有预期的 Qt.ConnectionType 输出,而不是“方法” 或参数 1 具有意外类型“NoneType”

此脚本用于从网络下载文件。在下载(自我)中,更多的行被注释掉只是为了尝试有我的代码。

class Ui_Qwid(object):
    def setupUi(self, Qwid):
        Qwid.setObjectName("Qwid")
        Qwid.resize(423, 795)
        Qwid.setWindowTitle("Softs de secours")
        self.gridLayoutWidget = QtWidgets.QWidget(Qwid)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(-1, 9, 431, 791))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")


        for key,val in les_soft.items():

            self.btn = QtWidgets.QPushButton(key)
            self.gridLayout.addWidget(self.btn)
            self.btn.clicked.connect(self.download(key))


    def download(self,key):
        print("on passe par la")
        urllib.request.urlretrieve(les_soft[key],key+".exe")


        local_filename = key
        url = les_soft[key]
        # NOTE the stream=True parameter
        r = requests.get(url, stream=True)
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024): 
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)

感谢您的宝贵时间

【问题讨论】:

python2 还是 python3?请显示完整的代码。 对不起,这是 python 3.6 这是 PyQt5 中缺少的所有代码 import QtCore,QtGui,QtWidgets import sys #import urllib.request 导入请求和字典,真的很长,太长了回复 【参考方案1】:

当您将信号连接到其插槽时,您不应将评估的函数传递给它,而只传递函数的名称。我还建议连接在继承自 QWidget、QMainWindow 等的类环境中。

这个例子我不能完全复现,但如果我能概括它,那就创建一个字典来模拟你的数据。

为了获得所需的密钥,我们使用对象作为源并使用函数text() 来获取它。

sender() 函数获取生成信号的对象,在本例中为您按下的按钮。

import sys
from PyQt5 import QtCore

from PyQt5 import QtWidgets


class Ui_Qwid(object):
    def setupUi(self, Qwid):
        Qwid.setObjectName("Qwid")
        Qwid.resize(423, 795)
        Qwid.setWindowTitle("Softs de secours")
        self.gridLayoutWidget = QtWidgets.QWidget(Qwid)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(-1, 9, 431, 791))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")


class Widget(QtWidgets.QWidget, Ui_Qwid):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)
        self.setupUi(self)

        self.les_soft = 'key1': 'url1', 'key2': 'url2', 'key3': 'url3', 'key4': 'url4',
                         'key5': 'key5', 'key6': 'url6', 'key7': 'url7', 'key8': 'url8'

        for key, val in self.les_soft.items():
            self.btn = QtWidgets.QPushButton(key)
            self.gridLayout.addWidget(self.btn)
            self.btn.clicked.connect(self.download)

    def download(self):
        key = self.sender().text()
        print(key)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【讨论】:

非常感谢您的时间和答案。我不确定是否理解,但我会继续尝试,现在我将尝试为此添加线程。

以上是关于pyQt5从dict创建按钮连接到具有附加值的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在从串口python pyqt接收的textbrowser pyqt5上附加串行数据[重复]

如何在 Python 中将函数连接到 PyQT5 GUI

使用按钮 PyQt5 打开一个小部件

PyQt5 无法连接到显示器

PyQt5:将按钮位置附加到窗口坐标

从字典创建 pyqtSignals