如何通过可变成一个功能连接一个按钮pyqt5python[封闭]

0

的问题

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_label{i}.setGeometry(250,{y_axis_name},340,110)')
     exec(f'self.name_label{i}.clicked.connect(open_browser({i}))')
     y_axis_name= y_axis_name + 110

"我"是一个可变的,我不能找到一种方式按一下按钮的自我。name_label并随后连接到一个功能,并通过在可变"i"。 当我试图运行我得到的错误

image of error

它似乎变量的"我"并不是替换由一个数字的范围所表示的"我"并不是我的信中试图通过。

pyqt5 python
2021-11-22 17:19:19
1

最好的答案

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-循环创造的对象然后更好地使用 list 保持这些对象。 它不需要 exec() 它可以更有效的后-因为以后你可以再次使用 for-循环检查所有对象名单。

不管它看起来很奇怪,当有人需要 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     
2021-11-22 21:28:58

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................