如何解决wxPython - 为当前用作 CLI 版本的应用程序创建 GUI - 不确定从哪里开始
我知道这是一个非常模糊的问题,但我刚刚使用 wxPython 进行 GUI 开发,可以使用一些指导。我有一个程序:
- 打开一个模式对话框,用户可以在其中选择包含要分析的数据的 .csv 文件
- 将数据存储为 Pandas DataFrame 对象
- 对数据进行一些格式化、清理和计算
- 用计算结果生成一个新的数据框
- 绘制结果(线性回归)并显示结果表,并将绘图和新表分别保存为 .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 举报,一经查实,本站将立刻删除。