python动态生成的按钮批量连接点击事件槽函数

文章讲述了在GUI编程中,作者比较了使用`exec()`执行Python代码、lambda表达式以及QSignalMapper来处理槽函数的方法,强调了lambda表达式的延迟执行问题和QSignalMapper的优势.
摘要由CSDN通过智能技术生成

先说方式,我目前接触的有以下几种:

1. 使用exec()

2. 立即执行一次lambda表达式

3. 使用QSignalMapper()


exec()

exec可以执行 Python 代码,用于执行存储在字符串或对象代码中的 Python 语句

        # 字母键连接到槽函数
        for i in range(97, 123):
            exec("""self.char_{0}_.clicked.connect(
                    self.btn_char_{0}_clicked)""".format(chr(i)))
    # 字母键槽函数
    for i in range(97, 123):
        exec("""
def btn_char_{}_clicked(self):
    name = sys._getframe().f_code.co_name
    char = self.get_key_symbol(name)

    if self.Caps or self.double_Caps:
        char = char.upper()
        self.Caps = False    # 一次一按
        self.change_caps_style()

    self.data = char
    self.send_data()
    msg = name + ' 按下 ' + char + ' 发送: ' + self.data
    print(msg)
        """.format(chr(i)))

lambda表达式

info['data_carrier']的数据类型为QPushButton

lambda表达式中的参数不会立即被调用,只有当lambda表达式被真正执行时,其中的参数当时的数据才会被真正使用

因此会出现一种问题:for循环connect了N个lambda表达式,传参0-N,但是在实际触发时,传入的参数始终是N

为了避免这个问题,应当首先执行一次lambda表达式,利用函数指针

        self.info_list = gridLayout_dynamic_create(999, self.rows, self.group, self.ui.gridLayout, None, self)
        # 点击事件
        for info in self.info_list:
            def on_data_carrier_buttons_clicked(data_carrier):
                return lambda: self._show_pop_box(data_carrier)

            connect_func = on_data_carrier_buttons_clicked(info['data_carrier'])
            info['data_carrier'].clicked.connect(connect_func)

QSignalMapper

self.my_mapper = QSignalMapper()                    
for i, unit in enumerate(units):
    self.my_mapper.setMapping(button, i)
    button.clicked.connect(self.my_mapper.map)
self.my_mapper.mappedInt.connect(self._fun)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Python 的循环语句和字符串拼接来批量生成大量函数。下面是一个示例代码,可以生成指定数量的函数: ```python def generate_functions(num_functions): for i in range(num_functions): function_name = f"function_{i}" function_code = f"def {function_name}():\n print('{function_name} called')" exec(function_code) ``` 调用 `generate_functions(5)` 将会生成 5 个函数,分别为 `function_0` 到 `function_4`,每个函数输出自己的名称。 需要注意的是,使用 `exec` 函数来执行生成的代码可能存在一些安全风险,因此在使用时需要谨慎考虑。 ### 回答2: Python中可以使用装饰器和循环来批量生成大量函数。装饰器是一种特殊的函数,可以用来修改或者包装其他函数的功能。 首先,我们可以创建一个装饰器函数,用于生成指定数量的函数。这个装饰器可以接收参数,如函数名称前缀、函数数量等。 ```python def generate_functions(prefix, count): def decorator(func): for i in range(count): name = f"{prefix}_{i}" globals()[name] = func return func return decorator ``` 然后,我们可以在需要生成大量函数的地方,使用这个装饰器来装饰一个函数。装饰器会根据参数生成指定数量的函数,并将它们添加到全局变量中。 ```python @generate_functions("func", 10) def original_func(): pass ``` 上面的代码将会生成10个函数,分别命名为func_0、func_1、func_2......func_9。这些函数都是original_func的副本,除了名称不同,其余功能和original_func是一样的。 可以使用以下方式调用这些动态生成函数: ```python func_0() func_1() ... ``` 总结起来,通过使用装饰器和全局变量,我们可以在Python批量生成大量函数,简化了函数的编写和管理过程。 ### 回答3: 在Python中,可以使用循环结构和字符串拼接来批量生成大量函数。 首先,我们可以定义一个函数模板,其中包含需要批量生成函数的共同部分。这可以是函数的输入参数、返回值类型等。接下来,我们可以使用循环结构(如for循环)来迭代生成多个函数。在循环中,可以通过字符串拼接的方式,将函数名和函数动态生成,并使用exec()函数函数定义代码执行起来,从而生成大量函数。 下面是一个简单的示例代码: ```python def func_template(input): # 函数模板,包含共同部分的代码 # 可根据实际需求确定需要变动的部分,例如输入参数、返回值类型等 result = input * 2 return result for i in range(1, 11): # 使用循环结构批量生成函数 func_name = 'func_' + str(i) func_body = f"def {func_name}(input): \n return func_template(input)\n" exec(func_body) # 调用批量生成函数 output = func_5(10) print(output) ``` 在上述代码中,首先定义了一个函数模板`func_template`,然后使用for循环生成了10个函数函数名分别为`func_1`、`func_2`、...,每个函数都调用了函数模板。通过调用批量生成函数,我们可以得到对应的输出。 值得注意的是,批量生成大量函数可能会导致程序变得冗长和不易维护。因此,在实际应用中,应该根据具体需求慎重考虑是否真正需要批量生成大量函数,以及是否可以采用其他更简洁和灵活的方式解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值