无法使用 Fman FBS 打包和打开我的 PyQt GUI

Unable to package and open my PyQt GUI using Fman FBS

我正在尝试将我的 GUI 应用程序打包到使用 FMan FBS 的应用程序中。我能够创建和打开基本的普通应用程序;但是,当我尝试将自己的代码集成到默认代码中时,一旦我尝试 运行 应用程序,它就会立即关闭而无需 运行ning。

这里是默认代码:

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow

import sys

if __name__ == '__main__':
    # 1. Instantiate ApplicationContext
    appctxt = ApplicationContext()       
    window = QMainWindow()
    window.resize(250, 150)
    window.show()
    # 2. Invoke appctxt.app.exec_()
    exit_code = appctxt.app.exec_()      
    sys.exit(exit_code)

这行得通。但是,我的应用程序经常使用布局,因此我使用 QWidget 作为我的 window 而不是 QMainWindow。相信这可能就是程序打包后打不开的原因吧

这是我的代码示例:

class Interface:

    def __init__(self):
        self.app = QApplication([])

    def main(self):
        window = QWidget()
        window.setGeometry(550, 300, 850, 550)
        window.setWindowTitle("GUI")
        layout = QGridLayout()
        self.app.setStyle("Fusion")

        tabs = QTabWidget()
        tab1 = QWidget()
        tab2 = QWidget()
        tab3 = QWidget()
        tabs.addTab(tab1, "Tab1")
        tabs.addTab(tab2, "Tab2")
        layout1 = QGridLayout()
        layout2 = QGridLayout()

        # ...

        tab1.setLayout(layout1)
        tab2.setLayout(layout2)

        window.setLayout(layout)
        window.show()
        self.app.exec_()

我可以 运行 我的程序 "FBS run";但是,当实际使用 "FBS freeze/ FBS installer" 打包应用程序时,它无法正常打开。它确实与默认代码一起工作,这让我相信将它从 QMainWindow 更改为 QWidget 会导致它无法工作

逻辑类似fbs API已经创建了一个QApplication所以你必须创建它,在这种情况下你只需要对fbs提供的示例进行以下修改:

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QWidget, QTabWidget, QGridLayout

import sys

class Interface:
    def main(self):
        self.window = QWidget()
        self.window.setGeometry(550, 300, 850, 550)
        self.window.setWindowTitle("GUI")
        layout = QGridLayout()

        tabs = QTabWidget()
        tab1 = QWidget()
        tab2 = QWidget()
        tab3 = QWidget()
        tabs.addTab(tab1, "Tab1")
        tabs.addTab(tab2, "Tab2")
        layout1 = QGridLayout()
        layout2 = QGridLayout()

        # ...

        tab1.setLayout(layout1)
        tab2.setLayout(layout2)

        self.window.setLayout(layout)
        self.window.show()

if __name__ == '__main__':
    # 1. Instantiate ApplicationContext
    appctxt = ApplicationContext()
    interface = InterFace()
    inteface.main()
    appctxt.app.setStyle("Fusion")
    # 2. Invoke appctxt.app.exec_()
    exit_code = appctxt.app.exec_()      
    sys.exit(exit_code)