2017-04-19 34 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()