首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问非GUI代码中的fbs资源文件

访问非GUI代码中的fbs资源文件
EN

Stack Overflow用户
提问于 2020-02-03 13:26:31
回答 1查看 691关注 0票数 3

使用fbs打包PyQt5应用程序,从非GUI代码访问资源文件的最干净的方法是什么?

在下面的示例中,我制作了一个简单的PyQt5应用程序,其中一个窗口包含一个按钮。该按钮触发一个函数,该函数将读取.json资源文件并在控制台中打印其属性message。在logic.py中定义的函数logic.py也应该在没有GUI应用程序的情况下工作,例如,其他python脚本将使用它。因此,它不能作为MainWindow类的方法移动。

使用应用程序上下文的get_resource()方法获取到mainwindow.ui的路径是简单和方便的。不幸的是,print_data()无法使用它获取static_data.json的路径,因为该函数无法访问应用程序上下文。

什么是最好的解决方案?

  • 只对gui相关资源文件使用fbs的资源系统,并将static_data.json与python文件保持在一起?
  • 尝试访问MainWindow类之外的应用程序上下文?
  • 使用另一个python资源库(如pkg_resources )来处理与gui无关的资源文件?
  • 使用另一个工具,如cx_freeze来打包应用程序?

目录结构:

代码语言:javascript
复制
|-- src
|  |-- main
|  |  |-- python
|  |  |  |-- main.py
|  |  |  |-- gui.py
|  |  |  |-- logic.py
|  |  |-- resources
|  |  |  |-- base
|  |  |  |  |-- mainwindow.ui
|  |  |  |  |-- static_data.json

main.py含量

代码语言:javascript
复制
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含量

代码语言:javascript
复制
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含量

代码语言:javascript
复制
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"])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-03 16:21:39

代码语言:javascript
复制
python
├── base.py
├── gui.py
├── logic.py
└── main.py

一个可能的解决方案是在每个人都可以访问该变量的文件中创建上下文:

base.py

代码语言:javascript
复制
from fbs_runtime.application_context.PyQt5 import ApplicationContext

context = ApplicationContext()

然后在其他类中使用它:

gui.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60040208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档