这是我目前的脚本:
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”被创建时一样。
如何避免sound
lambda 语句中传递的值在更改时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] 删除。
我来说两句