2014-07-29 6 views
0

Я пытаюсь создать подформу для чтения файлов внутри программы. У меня есть несколько кнопок, которые в основном повторяют один и тот же процесс в разных файлах.Вызов той же функции в pyqt при нажатии любой кнопки

Кнопка вызывает функцию «loadfiles». Параметры, переданные с использованием лямбда-функции, в «loadfiles» - это строка и метка.

self.btnPts.clicked.connect(lambda: self.loadfiles("PtsFile",self.label)) 
    self.btnIll.clicked.connect(lambda: self.loadfiles("IllFile",self.label_2)) 
    self.btnSigIll.clicked.connect(lambda: self.loadfiles("SigIll",self.label_3)) 
    self.btn.clicked.connect(lambda: self.loadfiles("FutureFile",self.label_4) 

Есть ли способ, что я могу сгруппировать все кнопки вместе и сжать эти заявления в одно заявление (что-то похожее на события в Excel VBA).

Могу ли я добавить кнопки в список, а затем привязать к нему «clicked.connect», чтобы он вызывал мою функцию evertime.

(я начал кодирования в Python только 2 недели назад, и это мой первый раз здесь. Поэтому, пожалуйста, дайте мне знать, если информация, представленная в этом вопросе достаточно.)

Update . .

Я смог выполнить эту работу, используя частичные функции. Как я уже упоминал в моем вопросе выше, я хотел передать конкретную строку и связанный ярлык функции, когда была нажата кнопка. И я хотел сделать это менее взвешенно.

Я использовал словарь для хранения своих кнопок и используемых меток в качестве ключей. Затем я использовал цикл for для итерации через словарь.

кнопки = {self.btnPts: self.label, self.btnIll: self.label_2, self.btnSigIll: self.label_3, self.btn: self.label_4}

for button in buttons: 
     button.clicked.connect(partial(self.loadfiles,button.objectName(),buttons[button])) 

Кредит: Я был способный проделать свой путь через этот ответ. Connecting slots and signals in PyQt4 in a loop

+0

Так вы просто хотите иметь одну кнопку или хотите иметь несколько кнопок, которые все делают одинаково? – miindlek

+0

Привет, у меня есть несколько кнопок. Я хочу вызвать ту же функцию. –

+0

И что? Это сработало? – miindlek

ответ

0

Если вы хотите сделать это просто, вам нужно создать какое-то сопоставление между метками, кнопками и строкой, которую вы отправляете на self.loadfiles.

Например, быстрое и грязное отображение вручную является:

mapping = [(self.btnPts, "PtsFile", self.label), 
      (self.btnIll, "IllFile", self.label_2), 
      (self.btnSigIll, "SigIll", self.label_3), 
      (self.btn, "FutureFile", self.label_4)] 

Вы можете работать как программно генерировать это отображение самостоятельно (не достаточно информации в вашем вопросе для меня, чтобы предложить, как). Могут быть и другие форматы, которые также подходят.

Вы можете затем цикл по этому списку и вызовите clicked.connect следующим образом:

for button, filename, label in mapping: 
    button.clicked.connect(lambda filename=filename, label=label: self.loadfiles(filename,label)) 

Примечание: это очень важно, что вы держите filename=filename, label=label часть определения лямбда. Если вы не выполните, то при выполнении функции лямбда он будет использовать текущее содержимое имени файла и метки, которое к моменту выполнения функции лямбда (при нажатии кнопки) всегда будет содержать данные для последней итерации цикла. Таким образом, код будет делать то же самое, что и кнопка, которую вы нажали.

+0

Ох ... просто видел, как ты работал, пока я писал свой ответ ... ну, ну :) –

+0

Блестящий! Я пытался заставить его работать с помощью лямбда-функций, но сдался после того, как пробовал почти час (по той же причине, о которой вы говорили в заметках). Большое спасибо за объяснение лямбда-еского способа сделать это! –

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