使用fbs打包PyQt5应用程序,从非GUI代码访问资源文件的最干净的方法是什么?
在下面的示例中,我制作了一个简单的PyQt5应用程序,其中一个窗口包含一个按钮。该按钮触发一个函数,该函数将读取.json资源文件并在控制台中打印其属性message。在logic.py中定义的函数logic.py也应该在没有GUI应用程序的情况下工作,例如,其他python脚本将使用它。因此,它不能作为MainWindow类的方法移动。
使用应用程序上下文的get_resource()方法获取到mainwindow.ui的路径是简单和方便的。不幸的是,print_data()无法使用它获取static_data.json的路径,因为该函数无法访问应用程序上下文。
什么是最好的解决方案?
目录结构:
|-- src
| |-- main
| | |-- python
| | | |-- main.py
| | | |-- gui.py
| | | |-- logic.py
| | |-- resources
| | | |-- base
| | | | |-- mainwindow.ui
| | | | |-- static_data.jsonmain.py含量
from fbs_runtime.application_context.PyQt5 import ApplicationContext
import sys
from gui import MainWindow
if __name__ == '__main__':
appctxt = ApplicationContext()
window = MainWindow(appctxt)
window.show()
exit_code = appctxt.app.exec_()
sys.exit(exit_code)gui.py含量
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import uic
from logic import print_data
class MainWindow(QMainWindow):
def __init__(self, context):
super().__init__()
# Loading the .ui file from the resources
self.ui = uic.loadUi(context.get_resource("mainwindow.ui"), self)
# Binding the button to the print_data function defined in logic.py
self.main_button.clicked.connect(print_data)logic.py含量
import json
def print_data():
# Getting the resource data filepath
filepath = "../resources/base/static_data.json"
# Processing the resource file
with open(filepath) as file:
data = json.load(file)
print(data["message"])发布于 2020-02-03 16:21:39
python
├── base.py
├── gui.py
├── logic.py
└── main.py一个可能的解决方案是在每个人都可以访问该变量的文件中创建上下文:
base.py
from fbs_runtime.application_context.PyQt5 import ApplicationContext
context = ApplicationContext()然后在其他类中使用它:
gui.py
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import uic
from base import context
from logic import print_data
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Loading the .ui file from the resources
self.ui = uic.loadUi(context.get_resource("mainwindow.ui"), self)
# Binding the button to the print_data function defined in logic.py
self.main_button.clicked.connect(print_data)logic.py
import json
from base import context
def print_data():
# Getting the resource data filepath
filepath = context.get_resource("static_data.json")
# Processing the resource file
with open(filepath) as file:
data = json.load(file)
print(data["message"])main.py
import sys
from base import context
from gui import MainWindow
if __name__ == "__main__":
window = MainWindow()
window.resize(250, 150)
window.show()
exit_code = context.app.exec_()
sys.exit(exit_code)https://stackoverflow.com/questions/60040208
复制相似问题