Передача функции python в качестве аргумента функции в PyQt5 - PullRequest
0 голосов
/ 21 февраля 2020

Извините за длинный пост, но хотел дать как можно больше

Здесь не много кода, но я пытаюсь очистить огромную функцию кнопок в PyQt5 Gui

У меня есть вывод GUI, и все работает хорошо, и сейчас я пытаюсь удалить повторяющийся код и создаю функцию для создания кнопок.

В исправном Имя initUI у меня около 20 кнопок. Как видно из кода, старый способ создавал каждый из них по отдельности.

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

Это работает отдельно от аргумента defRun, отправленного кнопке. Это передача вызова другой функции Я выделил >>>> arg <<<< это не совсем в коде </em>

class iac2tf(QMainWindow):
    def __init__(self):
        super(iac2tf, self).__init__()
        self.initUI()
        self.setGeometry(0, 0, 1700, 1000)........

     def button (self, buttonName, buttonText, >>>>defRun<<<<, buttonWidth, buttonHeight, buttonx, buttony):
            self.buttonName = QtWidgets.QPushButton(buttonText,self)
        >>>>self.buttonName.clicked.connect(lambda:self.defRun)<<<<
            self.buttonName.resize(buttonWidth,buttonHeight)
            self.buttonName.move(buttonx,buttony)   
            self.buttonName.show()

    def initUI(self): 
            #passed style
            self.openFilebutton = self.button('openFile', 'Open File', >>>'open()'<<<< ,110,30,5,50)

            #Old style
            self.ProcessFile = QtWidgets.QPushButton('Process File',self)
            self.ProcessFile.clicked.connect(self.processFile)
            self.ProcessFile.resize(110,30)
            self.ProcessFile.move(5, 80)  


/......
   ....../


def open(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        file, _ = QFileDialog.getOpenFileNames(self, 'Ope....... 


app = QApplication(sys.argv)
win = iac2tf()
win.show()


Я пытался передать Зная, что некоторые потерпят неудачу, но хотел охватить все базы и был раздражен

  • str (open)

GUI открывается с

<built-in function open>

При нажатии кнопки

  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

  • str (open ())
self.openFilebutton = self.button('openFile', 'Open File', str(open()) ,110,30,5,50)
TypeError: Required argument 'file' (pos 1) not found


  • str (self.open)

GUI открывается с

<bound method iac2tf.open of <__main__.iac2tf object at 0x7f87e73da948>>

при нажатии кнопки

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

  • str (self.open ())

Открыть меню выбора файлов ie Начать открытое веселье c


  • self. open

GUI запускается

<bound method iac2tf.open of <__main__.iac2tf object at 0x7fdcb2dee948>>

при нажатии кнопки

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

  • 'self.open'
  • ' self.open () '
  • ' open () '
  • ' open '

открывает GUI без ошибки

при нажатии кнопки

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

  • открыто

открывает GUI с

   <built-in function open>

при нажатии кнопки

 Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

  • open ()
self.openFilebutton = self.button('openFile', 'Open File', open() ,110,30,5,50)
TypeError: Required argument 'file' (pos 1) not found

  • переход к локальному веселью c вар все выше, но как есть: (

1 Ответ

1 голос
/ 21 февраля 2020

Вот пример передачи функций в качестве аргументов.

class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.vbox = QVBoxLayout(self)
        self.create_button('Open', self.open)
        self.create_button('Close', self.close)

    def create_button(self, text, slot):
        btn = QPushButton(text)
        btn.clicked.connect(slot)
        self.vbox.addWidget(btn)

    def open(self):
        QFileDialog.getOpenFileName(self)

Также стоит отметить, что arg buttonName фактически никогда не используется в этой функции:

def button (self, buttonName, buttonText, >>>>defRun<<<<, buttonWidth, buttonHeight, buttonx, buttony):
    self.buttonName = QtWidgets.QPushButton(buttonText,self)
    . . .

Эта переменная существует только в локальной области функции, а self.buttonName полностью относится к другому объекту. То есть, если вы хотите сослаться на кнопку, которую вы создали, где вы передали 'openFile' для аргумента buttonName, она не будет называться self.openFile, она будет называться буквально self.buttonName. Однако вы можете использовать exec() для достижения этой цели, хотя это обычно не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...