微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

我想要一个 GUI,当启动时,会出现一个简单的窗口,其中包含一些文本和中间的一个按钮“导入 csv 以开始”或其他内容(我能够通过子类化 wx.Frame 来创建第一个窗口,但该按钮目前不执行任何操作)。单击该按钮时,将打开模式对话框,以便用户可以选择 .csv 数据文件。单击确定/打开/无论按钮是什么(漫长的一天,内存没有工作),窗口/框架将更改为不同的布局(再次,能够为该框架拼凑一个类)。我的问题主要是我应该如何在改变帧的同时获取帧之间的数据。

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

        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()

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

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

解决方法

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

启动应用程序
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,自定义)类 DataHandler,根据用户在 { 中的输入设置各种属性{1}} 实例,调用分析数据的 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

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

希望这会在未来对某人有所帮助:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。