2016-01-26 2 views
0

Je crée une interface graphique dans laquelle j'ai besoin de créer un certain nombre d'entrées et de boutons dans Tkinter. Je voudrais créer tout cela dans une boucle for. Comme actions, quand j'appuie sur n'importe quel bouton, il devrait transférer la valeur de l'entrée au rappel du bouton à côté de lui.Création d'une entrée et de boutons liés dans tkinter

C'est ce que j'ai fait jusqu'à présent mais ça ne fonctionne pas encore.

n=0 
self.button = [] 
self.entFreq = [] 

for calVal in calibration:                    
    lbl = Label(self.calFrame) 
    lbl.configure(text = "Set amplitud to " + calVal) 
    lbl.configure(background=self.bg_App, fg = "white") 
    lbl.grid(row=n, column=0) 

    self.entFreq.append(Entry(self.calFrame, width=10)) 
    self.entFreq[n].grid(row=n, column=1, padx = 10) 

    #Construction Button send frequency 
    self.button.append(Button(self.calFrame, text="Cal", borderwidth=0, relief="groove", command = lambda n=self.entFreq[n].get(): self.get_val(n))) 
    self.button[n].configure(bg="#FFF3E0") 
    self.button[n].grid(row=n, column=2) 
    n+=1 

def get_val(self, var): 
    print "Got this:", str(var) 

Je suis simplement vide dans la fonction var. Comment lier ces deux?

Répondre

1

Vous mettez trop de code dans vos lambdas. Il vous suffit de passer n et get_val peut faire le reste du travail:

self.button.append(Button(..., command=lambda n=n: self.get_val(n))) 
... 
def get_val(self, n): 
    value = self.entFreq[n].get() 
    print "Got this:", value 

Vous voudrez peut-être envisager de définir une classe pour cet ensemble d'étiquettes, l'entrée et le bouton, car ils sont conçus pour fonctionner ensemble et vous faites plusieurs séries.

Vous pouvez, par exemple, transmettre une étiquette et une fonction à appeler lorsque l'utilisateur clique sur le bouton. Par exemple:

class LabelEntry(object): 
    def __init__(self, parent, text, command): 
     self.command = command 
     self.label = Label(parent, text=text) 
     self.entry = Entry(parent) 
     self.button = Button(parent, text="Cal", command=self.call_command) 

    def call_command(self): 
     value = self.entry.get() 
     self.command(value) 

On peut l'utiliser quelque chose comme ceci:

def some_function(self, value): 
    print "the value is", value 
... 
for calVal in calibration: 
    le = LabelEntry(frame, 
        text="Set aplitud to " + calVal, 
        command=self.some_function) 
    le.label.grid(...) 
    le.entry.grid(...) 
    le.button.grid(...) 
+0

Merci beaucoup pour la réponse, très claire. Il fonctionne comme un charme. J'aimerais pouvoir programmer de la même façon! – guibe80