wxPython - 为当前用作 CLI 版本的应用程序创建 GUI - 不确定从哪里开始
wxPython - creating a GUI for an application that currently works as a CLI version - not sure where to start
我知道这是一个非常模糊的问题,但我刚刚开始使用 wxPython 进行 GUI 开发并且可以使用一些指导。我有一个程序:
- 打开一个模式对话框,用户可以在其中 select 包含要分析的数据的 .csv 文件
- 将数据存储为 pandas DataFrame 对象
- 对数据进行一些格式化、清理和计算
- 使用计算结果生成一个新数据框
- 绘制结果(线性回归)并显示结果表格,并将绘图和新表格分别保存到 .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 方法,其中一旦显示一个帧,就应该销毁前一个帧。
希望这对以后的人有所帮助:)
我知道这是一个非常模糊的问题,但我刚刚开始使用 wxPython 进行 GUI 开发并且可以使用一些指导。我有一个程序:
- 打开一个模式对话框,用户可以在其中 select 包含要分析的数据的 .csv 文件
- 将数据存储为 pandas DataFrame 对象
- 对数据进行一些格式化、清理和计算
- 使用计算结果生成一个新数据框
- 绘制结果(线性回归)并显示结果表格,并将绘图和新表格分别保存到 .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 方法,其中一旦显示一个帧,就应该销毁前一个帧。
希望这对以后的人有所帮助:)