【问题标题】:How to create a new object in the .connect function with pyqt?如何使用pyqt在.connect函数中创建一个新对象?
【发布时间】:2021-11-27 12:05:25
【问题描述】:

我想用单击的项目的名称创建一个新的 Class Lamp 对象。

self.listWidget_lamps.clicked.connect(Hue = Lamp(name_item))

由于这不起作用,我现在想知道正确的方法是什么样的,以及我需要如何将 Lamp 类继承到 class Ui_MainWindow(object):

这是我的代码(问题第 52 行): https://pastebin.com/rjg96kuJ

这是Lamps类的初始化:

class Lamp:
    """Class to control phillips hue lamps/groups"""

    def __init__(self, name: str):
        self.name = name
        with open("data.json", "r") as self.file:
            self.data = json.load(self.file)
        self.brightness = self.data["lamps"][self.name]["brightness"]
        self.xy = self.data["lamps"][self.name]["color"]

【问题讨论】:

  • 注意:您应该永远尝试手动编辑 pyuic 文件。在有关using Designer 的官方指南中阅读有关处理这些文件的正确方法的更多信息。

标签: python oop pyqt5


【解决方案1】:

...cliked.connect() 的输入必须是一个函数——可以用一对括号调用。所以Hue = ... 将不起作用。相反,请使用 lambda 函数或您定义的函数。另请注意,要获取项目的名称,您应该使用...itemClicked.connect() 而不是...clicked.connect(),它将单击的项目作为参数传递给函数。这是(我相信)最短的方法,虽然非常不可读且不推荐:

self.listWidget_lamps.itemClicked.connect(lambda item: globals().update({"Hue": Lamp(item.text())}))

这是推荐的方式:

Hue = None
def new_lamp(item):
    global Hue
    Hue = Lamp(item.text())
self.listWidget_lamps.itemClicked.connect(new_lamp)

【讨论】:

  • 谢谢!我在开头和第 43 行这样实现它,但是每次我单击列表小部件的一个元素时它都会崩溃......你能帮帮我吗? pastebin.com/e3yiqzN6
  • 您遇到什么错误?你能把错误信息贴在这里吗?
  • 如果没有错误消息就很难判断,但我认为问题可能在于您使用的是...clicked.connect() 而不是...itemClicked.connect()。尝试使用它。
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2016-01-10
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多