Python:在循环中创建 Tkinter 按钮时如何在 lambda 函数中传递不同的参数?

布莱恩

这是我目前的脚本:

import tkinter as tk

class Soundboard(tk.Frame):
    def __init__(self, sounds, master=None):
        super().__init__(master)

        self.sounds = sounds

        self.pack()    
        self.create_button_loop()

    def create_button_loop(self):
        self.buttons = {}
        for name, sound in self.sounds.items():
            self.buttons[name] = tk.Button(self, text=name, command = lambda :play_sound(sound))
            self.buttons[name].pack(side='top')    
        #sound = 10



def play_sound(a_sound):
    print(a_sound)


#MAIN SCRIPT
if __name__ == '__main__':

    sounds = {'a':1, 'b':2, 'c':3}
    board = Soundboard(sounds)

有一个类Soundboard和一个函数play_sound,以及底部的脚本部分。声音是有图案的字典{name : sound}目前sound只是一个数字,而功能play_sound只是打印所谓给它。

我一直有这个问题的create_button_loop方法Soundboard在循环中,对于每个name/sound组合,在 dictself.buttons创建一个按钮,其中name是按钮的文本并sound传递给play_sound(lambda 语句)。

我想要发生的是在创建按钮时sound通过 lambda 语句sound,而不是sound按下按钮时是什么,所以play_sound应该打印sound. 实际发生的是 assound稍后重新分配(通过循环的下一次迭代),当按下按钮时,play_sound播放当前值sound是什么。

在此示例中,创建了 3 个按钮,“a”、“b”和“c”。当“a”被按下时,“3”被打印出来(最近的重新分配sound是在for循环的最后一次迭代中,所以name/ sound= c/3而不是“1”,就像按钮“a”被创建时一样。

如何避免soundlambda 语句中传递值在更改时sound发生更改?我更喜欢这样的迭代方法,而不是为每个{name:sound}组合编写不同的回调函数,但如果这是最好的方法,请告诉我。先感谢您!

小说

使用functools.partial代替 lambda。

from functools import partial
...
self.buttons[name] = tk.Button(self, text=name, command=partial(play_sound, sound))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python Tkinter更改在for循环中创建的单个按钮参数

Tkinter Python:如何通过OptionMenu中的lambda函数传递多个参数

Tkinter - 从循环中创建的按钮中检索文本

在Tkinter(Python3)中的循环中声明按钮

如何创建Python Lambda列表(在列表理解/ for循环中)?

如何在Tkinter中创建停止按钮?

如何使用lambda函数在Python for循环中捕获KeyError?

在For循环中使用If创建lambda函数

在for循环中创建的lambda函数被覆盖

如何使用 lambda 在 for 循环中创建 if?

tkinter 中循环中按钮上的图像

如何为在 tkinter 中循环创建的按钮提供不同的命令?

Python Tkinter创建带有循环的按钮并编辑其参数

如何在python 3的tkinter中按下按钮时显示标签

Python-Tkinter,Combobox - 使用 Lambda 函数传递 2 个参数

在python中创建netCDF文件时如何在循环中写入变量

tkinter:更改在循环中创建的按钮的按钮属性

如何在lambda函数中传递和检索多个参数?

Tkinter-python 按钮在另一个函数的循环中没有响应

通过Tkinter中的Button将参数传递给函数,循环中出现starnge行为

为 Tkinter 的 for 循环中创建的按钮分配功能

Tkinter 在循环中创建多个按钮并更改单击的文本

Tkinter - 在 for 循环中单击时禁用按钮

如何在tkinter中创建MacOS的“帮助”按钮?

如何在tkinter中创建按钮的自调整大小网格?

如何在Tkinter中更新为列表创建的按钮的文本

如何在 Tkinter 中创建可滚动的按钮列表?

Python/Tkinter Lambda 事件参数问题

我如何在 tkinter 中创建一组带有循环的按钮?