将信号连接到插槽会立即导致信号被发射

2023-12-13

我正在用 python 3.3.3 和 pyqt5 编写一个程序。我已经连接了很多信号和插槽,没有任何问题。这导致了一个问题。我的代码如下:

   def populateVendorAndModelComboBoxes(self, vendorComboBox, modelComboBox):
    dictVendors = {}
    #for rclass in sorted(list(directory.DRV_TO_RADIO.values())):
    for rclass in list(directory.DRV_TO_RADIO.values()):
        if not issubclass(rclass, chirp_common.CloneModeRadio) and \
                not issubclass(rclass, chirp_common.LiveRadio):
            continue

        if not rclass.VENDOR in dictVendors:
            dictVendors[rclass.VENDOR] = []

        dictVendors[rclass.VENDOR].append(rclass)

    vendorComboBox.addItems(sorted(list(dictVendors)))

    def _vendorChanged(vendorCBox, vendorsDict, modelCBox):

        modelsList = vendorsDict[vendorCBox.currentText()]

        added_models = []

        modelCBox.clear()
        for rclass in modelsList:
            if rclass.MODEL not in added_models:
                added_models.append(rclass.MODEL)
        print("adding to modelCB")
        modelCBox.addItems(sorted(added_models))
        print("Done adding to modelCB")

    vendorComboBox.currentTextChanged.connect(_vendorChanged(vendorComboBox, dictVendors, modelComboBox))
    _vendorChanged(vendorComboBox, dictVendors, modelComboBox)

此代码用供应商和型号填充组合框。供应商组合框在启动时填充。模型组合框填充了每个供应商的不同数据。每次用户选择不同的供应商时,模型组合框都必须使用不同的列表进行更新。

应该发生什么:

当调用 populateVendorAndModelComboBoxes 方法时,程序的第一部分将供应商列表放入供应商组合框中。然后,将在 currentTextChanged 信号和 _vendorChanged 槽之间建立连接。然后应该首先调用 _vendorChanged 函数来设置模型组合框。从那时起,每当用户选择新供应商时都应该调用 _vendorChanged 函数。

怎么了:

当 currentTextChanged 信号和 _vendorChanged 槽之间建立连接时,立即调用 _vendorChanged 函数。它不应立即调用 _vendorChanged 函数。我的任何其他信号/槽连接都不会发生这种情况。 _vendorChanged 函数执行时没有错误,然后执行点返回到vendorComboBox.currentTextChanged.connect.... 语句,我立即收到错误 TypeError: argument 1 has Outstanding type 'NoneType'。

如果我注释掉建立连接的语句,程序就可以正常运行。供应商组合框填充了供应商,型号组合框填充了列表中第一个供应商的型号。这表明 _vendorChanges 代码工作正常。

我有两个问题。为什么connect语句会导致_vendorChanged函数立即执行?出现错误信息的原因是什么?


基于 ekhumoro 的答案,您还可以让信号将 currentText 传递给 lambda 函数。这意味着您只需将文本传递到函数中,而不必稍后获取 currentText。

def _vendorChanged(vendorText, vendorsDict, modelCBox):

    modelsList = vendorsDict[vendorText]

    added_models = []

    modelCBox.clear()
    for rclass in modelsList:
        if rclass.MODEL not in added_models:
            added_models.append(rclass.MODEL)
    print("adding to modelCB")
    modelCBox.addItems(sorted(added_models))
    print("Done adding to modelCB")

vendorComboBox.currentTextChanged[str].connect(
    lambda vendorText: _vendorChanged(vendorText, dictVendors, modelComboBox))

另外,如果您不需要每次发出信号时根据 lambda 函数的当前范围更新对 dictVendors 和 modelComboBox 的引用,您可以将它们排除在参数列表之外,并让 _vendorChanged 函数简单地继承它们它是父作用域(与 lambda 的父作用域相同...所以我不确定有什么区别...)。这样做的吸引力在于,您不再需要 lamda 为信号提供可调用的...您可以直接为其提供 _vendorChanged 函数:

def _vendorChanged(vendorText):

    modelsList = dictVendors[vendorText]

    added_models = []

    modelComboBox.clear()
    for rclass in modelsList:
        if rclass.MODEL not in added_models:
            added_models.append(rclass.MODEL)
    print("adding to modelCB")
    modelComboBox.addItems(sorted(added_models))
    print("Done adding to modelCB")

vendorComboBox.currentTextChanged[str].connect(_vendorChanged)

希望有帮助!

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

将信号连接到插槽会立即导致信号被发射 的相关文章

随机推荐

  • 使用javascript分隔数组中的负数和正数

    我试图在 Javascript 中分离数组的负数和正数元素 这样之后首先出现所有负数元素 然后是正数元素 每个元素都按原始顺序排列 Example 输入数组 1 2 3 2 4 输出数组 3 2 1 2 4 输入数组 3 2 1 0 4 3
  • 如何忽略 Java 应用程序外部的过期证书?

    我们有一个 Java 应用程序 需要忽略过期的自签名证书 但是我们无法修改代码来执行此操作 我想知道我们是否可以在启动时提供系统属性或环境变量 以便我们暂时忽略所有过期的证书 或者甚至更具体 并从外部提供我们希望过期的特定证书被忽略 有人有
  • nginx 中 PATH_INFO 的空值返回垃圾值

    当 nginx 设置的 PATH INFO 为空字符串时 我在从 PHP 访问它时收到一些垃圾字符 这就是我在 nginx 中设置 PATH INFO 的方法 fastcgi split path info php fastcgi para
  • Linux 的 Rijndael 替代方案

    我有一个在 C Windows 中使用 Rijndael 对象的项目 我应该用c Linux来写它 我知道我应该使用 openssl aes 但不知道如何使用 包括哪些内容 班级名称是什么 方法 我应该使用什么来代替 Rijndael cr
  • 从我的应用程序在 Whatsapp 上分享视频

    我想分享视频 我有该视频的链接 当用户想要分享该视频时 它会在应用程序中下载 现在视频未在 Whatsapp 上共享 我现在不知道如何 这是我的代码我尝试过但没有成功 Intent videoshare new Intent Intent
  • 如何处理视图模型中的 Slider.ValueChanged 事件?

    我有一个PlayerV xaml内部带有滑块的视图
  • JW Player 无法在 ie9 和 ie10 中播放 MP4 视频格式的视频

    我在我的网页中实现了 jwplayer 6player 我可以在 ie9 和 ie10 浏览器中的 jw 播放器中播放 mp3 文件 但我无法在两个浏览器中播放 MP4 文件 但在 ie8 中工作正常 下面是我使用的代码
  • 流畅的 JavaScript 动画

    这是一些代码
  • 如何在 Matlab 中选择子矩阵(不以任何特定模式)

    如何在Matlab中选择子矩阵 不是任何模式 例如 对于一个大小为10 10的矩阵 如何选择由第1 2 9行和第4 6列交集组成的子矩阵 感谢您提供任何有用的答案 TLDR 简答 至于你的问题 假设你有一个任意的 10 10 矩阵A 提取所
  • 当其他应用程序启动时,手电筒会关闭。安卓

    我正在使用 Widget 开发手电筒应用程序 当我在小部件手电筒打开的情况下打开手电筒时 当我启动某些应用程序时 手电筒会关闭 为什么会发生这种情况 为什么我的手电筒无法在后台运行 我怎样才能防止这种情况发生 我希望手电筒只能由用户而不是系
  • 如何在不共享敏感信息的情况下从github推送和拉取?污迹和清洁?

    当我从 github 拉取到服务器存储库时 我想避免覆盖某些文件中的本地化敏感信息 例如 config php 注意 它不是开源类型的存储库 我完全控制存储库 我是唯一的用户 它是私有的 但最重要的是 它基于一个开源框架 可能会改变配置文件
  • 在 VS 2010 C# 项目之间共享 .cs 文件

    我想知道两个独立的 C Windows 项目 在两个独立的解决方案中 是否可以共享一个具有共享定义的 cs 文件 如果是这样 那又如何呢 附言 第一个项目是 ASP NET Web 应用程序 第二个项目是 C Windows 服务 作为 W
  • display:none 是否仍使用渲染性能

    可以说我有这样的标记 div style display none div 浏览器是否仍然使用资源来加载 Flash 对象 或者是否会延迟到调用 javascript 来切换 Flash 对象 dislplay block 现在请记住 我不
  • .NET Core 2.1 HttpClient 不返回预期值

    我正在使用一个接口从这个 url 调用 apihttp localhost 55260 api Accounts GetList 这是控制器的引用 HttpGet Route GetList AllowAnonymous public Ac
  • 单击按钮即可删除/添加类

    我希望能够从 div 中删除一个类 并通过单击按钮添加另一个类 但我无法让它发挥作用 div class hiddennav displaynone ul ul div div class fixednav div class showna
  • 将 Dataframe 传递给 Apply 函数 pandas 作为参数

    可以将 DataFrame 传递给apply像这样的功能 df2 df1 apply func axis 1 args df2 def func df1 df2 do stuff in df2 for each row of df1 ret
  • 在 Athena Aws 中连接行值

    我有 2 个列 可以说 id 和值 我想连接按 id col 分组的值 例如 我有 ID值 1 个 1b 2个 2b 我需要输出为 ID值 1a b 2a b 您可以使用array agg随后是一个array join select id
  • 如何在 Flutter 中使用查询访问 Cloud Firestore 的数组索引?

    我有田地users在文档中 该字段包含数组中的两个元素 我必须检查该数组中的特定两个值 首先 我用了array contains为此方法两次 但出现错误 如何访问 Cloud Firestore 中数组字段的索引 下面的代码是我的方法 但它
  • 存在寄存器溢出机制时,为什么会因为寄存器使用过多而无法启动内核呢?

    1 内核什么时候开始将寄存器溢出到本地内存 2 当没有足够的寄存器时 CUDA运行时如何决定不启动内核并抛出太多资源请求错误 多少个寄存器足以启动内核 3 既然存在寄存器溢出机制 即使没有足够的寄存器 难道不应该启动所有CUDA内核吗 1
  • 将信号连接到插槽会立即导致信号被发射

    我正在用 python 3 3 3 和 pyqt5 编写一个程序 我已经连接了很多信号和插槽 没有任何问题 这导致了一个问题 我的代码如下 def populateVendorAndModelComboBoxes self vendorCo