0

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

这是默认代码:

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 作为我的窗口而不是 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 安装程序”打包应用程序时,它无法正常打开。它确实适用于默认代码,这让我相信将它从 QMainWindow 更改为 QWidget 会导致它无法工作

4

1 回答 1

1

逻辑类似于 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)
于 2019-08-01T18:49:57.620 回答