2012-10-18 68 views
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() 

每個按鈕都會做同樣的事情,但訪問一個不同的文件,是否有更有效的方法來做到這一點,而不是簡單地爲每個按鈕編寫一個唯一的回調函數?

回答

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() 

也許你錯過的東西是一個下劃線(匿名)功能的定位。 λ函數非常像常規函數:

def foo(x): 
    return x*x 

bar = lambda x: x*x 

上述語句非常相似。例如foo(x) == bar(x)將永遠是True

+0

非常感謝!你是對的,我不明白lambda感謝解釋 –

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)) 
+0

Lambda應該工作,但我會去與functools.partial()。 – user1277476