wxPython将表单代码放入离散的.py文件中(不使用pubsub)

2024-10-05 14:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个基于Excel/VBA的应用程序迁移到wxPython/SQLite3,并在学习后者。随着时间的推移,我发现浏览代码变得越来越笨拙——目前只有880行,但这比我习惯管理的要多一些——所以我想知道是否有一个简单的解决方案来将每个表单的表单代码都放在discrete.pys中。在

例如,在current.py的底部,有一个启动主窗体的位:

class AuditApp(wx.App):
  def OnInit(self):
    self.aframe = audFrame(None, -1, "Audits Manager")
    self.aframe.Show(True)
    self.SetTopWindow(self.aframe)  # has to be *after* the Show()
    return True

def main():
  app = AuditApp(0)
  app.MainLoop()

if __name__ == '__main__':
  main()

该audFrame当前显示一个菜单和一个列表:

^{pr2}$

菜单显示其他形式和对话。对于那些表单,我想知道是否可以将代码放在一个discrete.py中。在

我看了一下pubsub,但它似乎有点过头了——表单只是进行数据收集,实际上并不需要与主表单进行任何通信,至少,这是我从这个excellent tutorial收集到的:

I see a number of questions on the wxPython mailing list or its IRC channel about communicating between frames and most of the time what the developer needs is the PubSub module. The Publisher / Subscriber model is a way to send messages to one or more listeners.

所有这些似乎都超出了我的需要,除非我误解了本教程的作者所说的“在两个框架之间通信”是什么意思。在

我想我要问的是:同一个应用程序的代码是否可以保存在多个.py文件中,其中每个窗体都有自己的.py文件,由绑定方法调用,以替代:

def dodoInterv(self, event):
    frm = frmIntervw(None, -1, "Post-Discharge Interview")
    frm.Show()

有什么东西叫(进口?)a.py代替。 我是不是在打开一个虫子罐头?在


Tags: theto代码pyself应用程序表单main
2条回答

对于那些有临时编程背景的人来做GUI驱动的程序,这确实是个问题。我帮助最大的是浏览wxpythonwiki中的ModelViewController tutorial。即使您同意使用MVC模式,但是不了解术语也很难理解讨论的内容。在

这个例子清楚地向您展示了什么属于MVC模式的哪个部分,以及如何使用python/wxPython编写它。在

例如:您将把属于dataretrieval(sqlite)的所有内容填充到它自己的对象中。现在是棘手的部分:如何告诉wxPython对象如何处理模型,或者如何让它们知道模型?在

输入控制器:假设要输入查询参数,请执行查询并显示结果:

  • 在视图部分(对应于审计框架的GUI部分)输入一个参数
  • 从控制器绑定到视图部件(例如,当单击“查询”时)
  • 使用控制器中的方法作为绑定方法的目标
  • 在controller方法中执行查询(大致对应于您的doConnect)
  • 在查询控制器方法的末尾,用查询的结果更新视图

MVC的例子是一个文件,但是如果你把东西分开,你可以把视图放在一个单独的.py文件中并导入它。视图甚至不需要了解sqlite/模型。要知道对象和对象之间的联系是由谁来完成的。在

编辑:回答您最初的问题:没有必要使用pubsub,在您相当简单的示例中,您可以使用回调。在

高温

尽管PyPubSub教程中的示例看起来毫无意义,但它只是演示如何使用模块。当需要处理独立于主线程运行的多个线程时,PyPubSub确实很有用。但这是事实,至少从我的经验来看,通过将一个帧的引用传递给另一个帧,可以克服PyPubSub的任何需求。在

至于你的问题,是的,你可以轻松地在几个模块上编写单个应用程序的代码。只需在需要的地方导入这些模块。人们总是这样做,否则不可能在一个py文件中编写整个代码。在

在py文件中,你可以简单地在主文件中编写不同的类。在

例如,audFrame是在一个单独的frame.py文件中定义的。您可以将main.py文件的代码更改为如下所示:

import frame

class AuditApp(wx.App):
  def OnInit(self):
    self.aframe = frame.audFrame(None, -1, "Audits Manager")
    self.aframe.Show(True)
    self.SetTopWindow(self.aframe)  # has to be *after* the Show()
    return True

def main():
  app = AuditApp(0)
  app.MainLoop()

if __name__ == '__main__':
  main()

相关问题 更多 >