Есть ли способ вызвать функцию из другого файла python при использовании сигналов и слотов в PyQt5?

#python #function #import #pyqt5

#python #функция #импорт #pyqt5

Вопрос:

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

Я импортирую функцию, используя эту строку кода:

 from Open import OpenFile
  

Я пытаюсь использовать OpenFile в другой функции :

 def experiment(self):
     BSel = QPushButton("Select File",self.window)
            self.window.tab1.layout.addWidget(BSel)
            BSel.clicked.connect(self.OpenFile)
  

Функция с именем OpenFile сохраняется в Open.py . Функция:

 def OpenFile(self):
    global fileName
    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    fileName, _ = QFileDialog.getOpenFileName(self.window, "Import File", "",
                                                  "All Files (*);;Data Files (*.asc);;Excel Files (*.csv)", options=options)
    print(fileName) 
  

Как я могу вызвать функцию OpenFile, сохраненную в отдельном файле python, при нажатии QBushButton?

Ответ №1:

Ваша функция OpenFile использует self аргумент, но это также анонимная функция (она не является членом класса); в результате это self будет аргумент, заданный вызывающими его сигналами.

У clicked сигнала всегда есть checked аргумент (который обычно False используется для обычных кнопок), поэтому self внутри OpenFile функции будет это значение bool, которое вызовет исключение, поскольку это значение не имеет никакого window атрибута.

Таким образом, вы не можете напрямую подключиться к нему. Вы должны либо использовать лямбда-выражение, либо вызвать другую функцию, которая действительно вызывает OpenFile . Поскольку вам, вероятно, понадобится возвращаемое имя файла, lambda здесь не подходит.

main.py

 class SomeWindow(QtWidgets.QMainWindow):
    def __init__(self):
        # ...
        self.button.clicked.connect(self.openFile)

    def openFile(self):
        fileName = OpenFile(self)
  

Open.py

 def OpenFile(parent):
    options = QtWidgets.QFileDialog.Options()
    options |= QtWidgets.QFileDialog.DontUseNativeDialog
    fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
        parent.window(), 
        "Import File", "", 
        "All Files (*);;Data Files (*.asc);;Excel Files (*.csv)", 
        options=options)
    return fileName
  

Если вы надеялись, что использование global fileName in Open.py приведет к «настройке» fileName в вашем основном скрипте, вы сбились с пути.

Глобальные переменные в Python являются глобальными для модуля: невозможно установить глобальный для скрипта из импортированного модуля / скрипта.

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