我正在编写一个包含很多按钮(超过100个)的程序,每个按钮都需要一个独特的结果,但所有结果都相似,这是第一个按钮的代码
box1= 'filepath to text file'
def openfile(filename):
filetxt = (open(filename,"r").read())
return filetxt
var.set(filetxt)
def Box1():
var.set(openfile(box1))
openfile(box1)
window1 = Tk()
window1.geometry('450x450')
var = StringVar()
Button1 = Button(donut,text = "Box #1", command= Box1 )
Button1.pack()
每个按钮都会做同样的事情,但访问一个不同的文件,有没有比只为每个按钮编写一个唯一的回调函数更有效的方法呢?
答案 0 :(得分:2)
通常,您将列表中的文件:
list_of_files = ...
然后你会创建一个函数来创建一个打开文件输入的按钮:
def file_open_button(filename):
b = Button(donut, text = 'open {0}'.format(filename), command = lambda: openfile(filename))
return b
现在迭代你的文件列表并创建按钮,随时打包:
for f in list_of_files:
button = file_open_button(f)
button.pack()
也许您缺少的是对lambda
(匿名)函数的理解。 lambda函数很像常规函数:
def foo(x):
return x*x
bar = lambda x: x*x
以上陈述非常相似。例如foo(x) == bar(x)
始终为True
。
答案 1 :(得分:2)
您的所有按钮都可以共享一个回调。您可以使用lambda将文件名传递给回调。例如:
path="/path/to/the/file"
b = Button(..., command=lambda f=path: openfile(f))
另一种选择是使用functools.partial。有些人认为这比lambda更具可读性:
b = Button(..., command=functools.partial(openfile, path))