2

我正在编写一个有很多按钮(超过 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()

每个按钮都会做同样的事情,但是访问不同的文件,有没有比简单地为每个按钮编写一个独特的回调函数更有效的方法呢?

4

2 回答 2

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

于 2012-10-18T18:27:46.593 回答
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))
于 2012-10-18T18:29:09.933 回答