2017-04-19 76 views
0

我在一個類中創建了幾個tkinter按鈕,其中按鈕數量和按鈕屬性取決於文件中的函數(所以我不能創建特定數量的變量來保存按鈕)。在定義tkinter按鈕的循環中更改python變量標識符

我的代碼看起來像這樣(愛惜整個代碼的複雜性):

import os 
import tkinter as tk 

Class(GUI): 

    def ButtonCreator(self): 
     self.HomeworkList = open("Files\HWNameList.txt", "r") 
     x = self.HomeworkList.readline() 
     while not x == "END": 
      x = x[0:-1] 
      HomeworkFileName = str("Files\HW-" + x + ".txt") 
      locals()["self.Button" + x] = tk.Button(master, text = x, command = lambda: self.DisplayHomeworkFile(FileName)) 
      locals()["self.Button" + x].pack() 
      x = self.HomeworkList.readline() 
     self.HomeworkList.close() 

    def DisplayHomeworkFile(self, filename): 
     os.startfile(filename) 

我打開看起來像這樣的文件...

HomeworkName1 
HomeworkName2 
HomeworkName3 
END 

當代碼運行,它會顯示寫在它們上面的正確文本的按鈕,但是當我點擊它們時,它們只顯示文件名的文件最後寫在HomeworkList文件中。不知道我做錯了什麼。

如果還有其他方法可以實現我正在嘗試的功能,我可以接受所有建議。

謝謝。

回答

0

這是一個經典的初學者問題,它來自誤解lambda的工作原理。對於這種情況,您需要使用functools.partial。你也需要忘記修改locals()。製作一個列表或字典來保存按鈕實例。

from functools import partial 

def ButtonCreator(self): 
    self.HomeworkList = open("Files\HWNameList.txt", "r") 
    x = self.HomeworkList.readline() 
    self.buttons = [] 
    while not x == "END": 
     x = x[0:-1] 
     HomeworkFileName = str("Files\HW-" + x + ".txt") 
     btn = tk.Button(master, text = x, command = partial(self.DisplayHomeworkFile, HomeworkFileName)) 
     btn.pack() 
     self.buttons.append(btn) 
     x = self.HomeworkList.readline() 
    self.HomeworkList.close()