如何将变量传递给连接到按钮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_label1
、name_label2
- 并使用append()
将按钮添加到列表中。它不需要使用exec()
,它会比分隔变量更有用
肯定你不能使用connect(open_browser(i))
,因为它会首先运行result = open_browser(i)
,然后是connect(result)
,所以它会尝试将button
与result
连接起来,而不是与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的函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章