【问题标题】:how to pass a variable into a function connected to a button pyqt5 python [closed]如何将变量传递给连接到按钮pyqt5 python的函数[关闭]
【发布时间】:2023-03-30 20:45:01
【问题描述】:
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

“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)功能连接

标签: python pyqt5


【解决方案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     

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2013-07-11
    • 2012-11-19
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多