#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 являются глобальными для модуля: невозможно установить глобальный для скрипта из импортированного модуля / скрипта.
Помните, что существует очень мало случаев, для которых использование глобальных переменных является правильным выбором, и в большинстве случаев, если вы используете его, вы, вероятно, делаете это по неправильной причине.