2017-04-19 1 views
0

J'ai une fonction dans une classe dans laquelle je crée plusieurs boutons tkinter, où le nombre de boutons et les propriétés du bouton dépendent d'un fichier (donc je ne peut pas créer un nombre spécifique de variables pour contenir les boutons).Modifier les identifiants de variables python dans une boucle qui définit un bouton tkinter

Le code je ressemble à ceci (en épargnant la complexité de l'ensemble du code):

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) 

Le fichier que je suis l'ouverture ressemble à ceci ...

HomeworkName1 
HomeworkName2 
HomeworkName3 
END 

Lorsque le code est exécuté , il affiche les boutons avec le texte correct écrit sur eux, mais quand je clique dessus, ils n'affichent que le fichier dont le nom de fichier est écrit en dernier dans le fichier HomeworkList. Je ne suis pas sûr de ce que j'ai mal fait.

S'il y a un autre moyen de réaliser ce que j'essaie, je suis ouvert à toutes les suggestions.

Merci.

Répondre

0

Ceci est un problème classique pour les débutants qui vient d'un malentendu sur le fonctionnement de lambda. Pour ce cas, vous devez utiliser functools.partial.

Vous devez également oublier de modifier locals(). Faites une liste ou un dictionnaire pour contenir les instances de bouton.

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