2016-01-26 2 views
0

Я создаю GUI, где мне нужно создать определенное количество записей и кнопок в Tkinter. Я хотел бы создать все это в цикле for. В качестве действий, когда я нажимаю любую из кнопок, он должен передать значение Entry в обратный вызов кнопки рядом с ним.Создание записи и кнопок, связанных в tkinter

Это то, что я сделал до сих пор, но пока не работает.

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) 

Я просто становлюсь пустым в функции var. Как связать эти два?

ответ

1

Вы помещаете слишком много кода в свои лямбды. Вам нужно только пройти в n и get_val может сделать остальную часть работы:

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 

Вы могли бы хотеть рассмотреть вопрос об определении класса для этого набора этикеток, записи и кнопок, так как они предназначены для совместной работы и вы делаете несколько наборов.

Вы можете, например, передать ярлык и функцию для вызова, когда пользователь нажимает кнопку. Например:

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) 

Вы использовали бы это что-то вроде этого:

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

Большое спасибо за ответ, очень ясно. Отлично работает. Хотел бы я запрограммировать то же самое! – guibe80