wxPython - 为当前用作 CLI 版本的应用程序创建 GUI - 不确定从哪里开始

wxPython - creating a GUI for an application that currently works as a CLI version - not sure where to start

我知道这是一个非常模糊的问题,但我刚刚开始使用 wxPython 进行 GUI 开发并且可以使用一些指导。我有一个程序:

  1. 打开一个模式对话框,用户可以在其中 select 包含要分析的数据的 .csv 文件
  2. 将数据存储为 pandas DataFrame 对象
  3. 对数据进行一些格式化、清理和计算
  4. 使用计算结果生成一个新数据框
  5. 绘制结果(线性回归)并显示结果表格,并将绘图和新表格分别保存到 .png 和 .csv 文件。

我想要一个 GUI,以便在启动时出现一个简单的 window,中间有一些文本和一个按钮“导入 csv 以开始”或其他东西(我能够首先创建这个 window 通过 subclassing wx.Frame,但该按钮当前不执行任何操作)。单击按钮时,模式对话框将打开,因此用户可以 select .csv 数据文件。单击 OK/Open/whatever 按钮(漫长的一天,记忆不起作用),window/frame 将更改为不同的布局(同样,能够为该框架拼凑出 class)。我的问题主要是我应该如何在更改帧的同时获取帧之间的数据。

我发现的在帧之间切换的方法是在 class 定义中包含方法

        def _NextFrame(self, event):
            self.frame.Show()
            self.Hide()

然后在 main() 的主体中将其称为

app = wx.App(redirect=True)

f1 = Frame("Frame1")
f2 = Frame("Frame2")
f1.frame = f2
f2.frame = f1

f1.Show()

app.MainLoop()

但这只是为了在同一框架的两个实例之间切换,而不是两个具有不同功能的不同框架。此外,我认为这种方式将在 运行 应用程序之前实例化所有框架,因此如果我在第二个框架的 __init__() 中调用了 self.getcsv() 函数,系统将提示用户在他们单击第一帧上的按钮之前打开文件(即使第二帧目前还不可见)。

我可以使用 CLI 版本的代码,在 classes 中构建 GUI,并在 wxPython 之外处理所有计算等,只使用 wx 来显示我想显示的内容吗?总的来说,我很迷茫。再次抱歉,这个含糊的问题,但我不知道还能去哪里。

已完成应用程序。对于其他绿色 GUI 程序员,我的处理方式是在绑定到逻辑 button/control(例如“开始”按钮、“分析”按钮等)的事件处理程序中实例化下一帧。例如,在为不同的框架、数据处理程序等创建所有 classes 之后,我使用

启动应用程序
def main():
    app = wx.App()
    frm = StartFrame(None)
    frm.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

在 StartFrame 实例中,有一个绑定到处理程序的“开始”按钮:

    def _OnStart(self,event):
        frm2 = ParaFrame(None)
        frm2.Show()
        self.Destroy()

ParaFrame框架有一个稍微复杂一点的“分析”按钮:它实例化了一个(非wx,自定义)classDataHandler,设置各种属性根据ParaFrame 实例中的用户输入,调用分析数据的 DataHandler 方法,然后实例化结果框架(它从 DataHandler 的分析中获取一些结果作为 __init__() 参数), 显示它, 删除 DataHandler, 并销毁自身:

    def _analyze(self, event):
        dhandler = DataHandler(self)
        dhandler.path = self.path
        dhandler.logconv = self.logbtn.GetValue()
        dhandler.numTar = int(self.inputNum.GetValue())
        dhandler.conc = self.inputcb.GetValue()
        for idx, tar in enumerate(self.tarcbs):
            dhandler.targets.append(self.tarcbs[idx].GetValue())
        dhandler._analyzeData()
        resfrm = ResultFrame(None, dhandler.targets, dhandler.dftables)
        resfrm.Show()
        del dhandler
        self.Destroy()

ResultFrame 实例中,除了仅显示结果外,还有用于退出应用程序(绑定到 _OnExit,如下)或从头开始重新启动应用程序到 运行一个新的分析(绑定到_OnRestart):

    def _OnExit(self, event):
        """Close frame & terminate app"""
        self.Close(True)

    def _OnRestart(self, event):
        frm = StartFrame(None)
        frm.Show()
        self.Destroy()

这种方法也有助于解决我发现的切换帧示例的问题;该示例适用于在两个持久帧之间来回切换,而我想要线性 A --> B --> C 方法,其中一旦显示一个帧,就应该销毁前一个帧。

希望这对以后的人有所帮助:)