Это связано с тем, что staticmethod является дескриптором и требует выборки атрибута на уровне класса для реализации протокола дескриптора и получения истинного вызываемого.
Из исходного кода:
Его можно назвать либо в классе (например,
blockquote>C.f()
), либо в экземпляре (например,C().f()
); экземпляр игнорируется, за исключением его класса.Но не непосредственно изнутри класса, пока он определяется.
Но, как заметил один комментатор, это вовсе не «дизайн на Pythonic». Вместо этого используйте функцию уровня модуля.
Работа с PyInstaller Я заметил, что просто не удается связать зависимости QML, а затем заморозить приложение. Вы можете проверить, также ли это ваш случай, скопировав папки QtQuick
и QtQuick.2
из пакетов сайта python (<your_python_path>\Lib\site-packages\PyQt5\Qt\qml
) и поместив их рядом с замораживаемым исполняемым файлом:
QtQuick
QtQuick.2
your_executable.exe
Если приложение работает после вы можете отредактировать файл .spec
, чтобы автоматически связывать эти папки (pyinstaller generate .spec
-файл при первом запуске).
# -*- mode: python -*-
import os
import site
block_cipher = None
site_packages_dir = site.getsitepackages()[1]
qml_dir = os.path.join(site_packages_dir, 'PyQt5', 'Qt', 'qml')
added_files = [
(os.path.join(qml_dir, 'QtQuick'), 'QtQuick'),
(os.path.join(qml_dir, 'QtQuick.2'), 'QtQuick.2'),
]
a = Analysis(['pyqt5_qml.py'],
binaries=None,
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='app',
debug=False,
strip=False,
upx=False,
console=True,
)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
name='pyqt5_qml')
Затем попробуйте запустить pyinstaller
против этого spec-файла: pyinstaller pyqt5_qml.spec
Для меня это в Windows, которая в итоге оказалась переменной среды QML2_IMPORT_PATH, не была установлена. Как только я установил это в «C: \ Python35 \ Lib \ site-packages \ PyQt5 \ qml", он сработал!
Я надеюсь, что это могло бы помочь
Я боролся с той же проблемой
Через несколько часов я сделал что-то простое, но для меня это сработало
In my main.py Я имею в виду файл, в который вы загружаете файл QML, который я добавил
import PyQt5.QtQuick
И затем запустите pyinstaller:
pyinstaller -F - -onefile main.py
И он работал