【问题标题】:Altering python variable identifiers in a loop which defines a tkinter button在定义 tkinter 按钮的循环中更改 python 变量标识符
【发布时间】:2017-09-16 02:29:33
【问题描述】:

我在一个类中有一个函数,我在其中创建了几个 tkinter 按钮,其中按钮的数量和按钮属性取决于文件(因此我无法创建特定数量的变量来保存按钮)。

我的代码看起来像这样(避免整个代码的复杂性):

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 文件的文件。不知道我做错了什么。

如果有其他方法可以实现我正在尝试的目标,我愿意接受所有建议。

谢谢。

【问题讨论】:

    标签: python class tkinter variable-assignment


    【解决方案1】:

    这是一个经典的初学者问题,源于误解 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2022-09-23
      • 2016-09-01
      相关资源
      最近更新 更多