如何将变量传递给连接到按钮pyqt5 python的函数[关闭]

Posted

技术标签:

【中文标题】如何将变量传递给连接到按钮pyqt5 python的函数[关闭]【英文标题】:how to pass a variable into a function connected to a button pyqt5 python [closed] 【发布时间】:2021-11-22 17:19:19 【问题描述】:
def open_browser(i):
            print("open")

 for i in range(5):
     new_name_label = 'name_label'+str(i)
     list_names.append(new_name_label)
     setattr(self, list_names[i], QPushButton(str(ordered_names[i]),self))
     exec(f'self.name_labeli.setGeometry(250,y_axis_name,340,110)')
     exec(f'self.name_labeli.clicked.connect(open_browser(i))')
     y_axis_name= y_axis_name + 110

“i”是一个变量,我找不到单击按钮 self.name_label 然后将其连接到函数并传入变量“i”的方法。当我尝试运行它时,我得到了错误

似乎变量“i”没有被替换为“i”表示的范围内的数字之一,而是试图传入 i 字母。

【问题讨论】:

你为什么使用exec 始终将代码、数据和完整的错误消息作为文本(不是屏幕截图,不是链接)放在有问题的地方(不在评论中)。它将更具可读性,更多人会看到它 - 所以更多人可以帮助你。 self.name_label 不是Button 而是正常的string - 你不能点击它` 如果你想要很多按钮,那么使用列表self.name_label = [] 代替变量name_label1name_label2 - 并使用append() 将按钮添加到列表中。它不需要使用exec(),它会比分隔变量更有用 肯定你不能使用connect(open_browser(i)),因为它会首先运行result = open_browser(i),然后是connect(result),所以它会尝试将buttonresult连接起来,而不是与open_browser(i)功能连接 【参考方案1】:

如果你想给函数赋值,那么你可以使用lambda来创建不带参数的函数

connect( lambda:open_browser(i) )

但如果你在循环中运行它,那么你可能还需要将值 i 复制到新变量。

connect( lambda x=i:open_browser(x) )

如果您直接使用i,那么所有按钮都将使用对变量i 的引用,而不是来自i 的值 - 最后所有按钮将获得相同的值 - 在循环中分配给i 的最后一个值。


代码connect(open_browser(i)) 用作

result = open_browser(i) 
connect(result)

因为def open_browser() 不使用return,所以它会自动运行return None,你的代码就像

result = None
connect(result)

你有

connect(None)

后来的错误显示Unexpected type "NoneType"


顺便说一句:

如果您使用for-loop 来创建对象,那么最好使用list 来保留这些对象。它不需要exec(),以后会更有用——因为以后你可以再次使用for-loop 来检查列表中的所有对象。

此外,当有人需要exec() 来创建代码时看起来很奇怪。

self.buttons = []

for i in range(5):
     b = QPushButton(str(ordered_names[i]), self)
     b.setGeometry(250, y_axis_name, 340, 110)
     b.clicked.connect( lambda x=i:open_browser(x) )

     self.buttons.append( b )

     y_axis_name += 110     

【讨论】:

以上是关于如何将变量传递给连接到按钮pyqt5 python的函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:如何将变量传递给类?

如何将变量从 PyQt5 UI 返回到 Main 函数 - Python

pyqt5 继承python类可以传递信号函数吗

PyQt5按钮lambda变量变为布尔值[重复]

PyQt5按钮lambda变量变为布尔值[重复]

如何正确地将 ComboBox 的模型从 python (pyQt5) 传递给 QML?