2017-02-08 2 views
0

Я отчаянно пытался заставить этот раздел кода работать в моей программе. Я по существу хочу прочитать несколько опций из файла и создать кнопки Tkinter из этих опций. Создание кнопок не проблема; В настоящее время я просто не могу заставить код запускать функции, которые я хочу.Как вызвать функцию из внешнего источника с помощью кнопки. [Python]

from Lib import StegosaurMainCode as Steg 
... 
class App: 
    def __init__(self, master, menu): 
     buttons = [] 
     for counter in range(0, len(menu[0])): 
      text = menu[0][counter] 
      func = menu[1][counter] 
      att = menu[2][counter] 
      buttons.append(Button(text=text, command=lambda: Steg.func(att))) 
     frame = Frame(master) 
     for item in buttons: 
      item.pack() 
     frame.pack() 

В этом классе функ функции я хочу назвать, Steg является внешним кодом в другом файл, и Att являются атрибутами для этой функции. Я не могу понять, почему Steg.func не пытается вызвать функцию в Штег называется «Func», а не та, что описана в переменной func

+0

Как вы импортируете Steg? –

+0

Просто отредактирован, чтобы вы могли видеть. –

+0

Что находится в 'menu [1] [counter]'? Является ли это строкой или фактической ссылкой на функцию? Какая ошибка возникает при запуске кода в вопросе? Мы не можем запускать его, потому что это зависит от переменных, которые нам неизвестны. Это поможет, если вы прочтете и следуете инструкциям в разделе [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

0

Попросите лямбда перепривязывают его параметр att при каждом вызове.

class App: 
    def __init__(self, master, menu): 
     buttons = [] 
     for counter in range(0, len(menu[0])): 
      text = menu[0][counter] 
      func = menu[1][counter] 
      att = menu[2][counter] 
      buttons.append(Button(text = text, command = lambda att = att: Steg.func(att))) 
     frame = Frame(master) 
     for item in buttons: 
      item.pack() 
     frame.pack() 
0

Предполагая, что menu[1][counter] содержит строку, а не ссылку на фактическую функцию, вам необходимо получить ссылку на функцию, которую затем можно использовать в качестве значения для атрибута command. Вы можете сделать это с GetAttr:

func = getattr(steg, menu[1][counter]) 

После того, как вы сделали это, вы можете использовать func, как если бы она была реальной функции. Однако вам необходимо привязать переменные к их текущим значениям, поэтому вам необходимо передать их в качестве аргументов в лямбда:

button = Button(text=text, command=lambda func=func, attr=att: func(att))) 
+0

Привет, спасибо за помощь. Есть ли шанс, что вы можете быстро сломаться и объяснить вторую строку кода, которую вы там положили. Я немного смущен, но понимаю, как это работает. –

Смежные вопросы