【问题标题】:wxFormBuilder with Python: access FlexGridSizer from subclasswxFormBuilder 与 Python:从子类访问 FlexGridSizer
【发布时间】:2013-09-01 04:43:33
【问题描述】:

我正在 wxFormBuilder 中构建一个 GUI,并在 Python 中为其编写代码。

我注意到我构建的所有小部件在生成的代码中都分配给了self。例如,带有单个文本的 GUI 可能如下所示:

class MyFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent)
        self.myStaticText = wx.StaticText(self,wx.ID_ANY,'My Text',0)

所以对象myStaticText 成为MyFrame 类的一个属性。这很好,因为我可以编写一个继承这个类的新类,然后执行其他功能,例如更新myStaticText 对象:

import MyFrmae
class GUI(MyFrame):
    def __init_(self,parent):
        MyFrame.__init__(self,parent)

    def updateText(self):
        self.staticText.SetLabel('My Other Text')

问题是 wxFormBuilder 没有在任何 FlexGridSizer 对象前面附加self。所以生成的代码如下:

myFlexGridSizer = wx.FlexGridSizer(3,1,0,0)

代替:

self.myFlexGridSizer = wx.FlexGridSizer(3,1,0,0)

因此,我无法从任何其他类访问该对象,而我确实需要这样做。

所以...

  1. 如果对象前面没有self,有没有办法从另一个类访问对象,即使我直接继承它?
  2. 有没有办法更改 wxFormBuilder 中的设置,使其附加self

【问题讨论】:

  • 只是一个建议:如果你是类 GUI 的职责只是更新一个 MyFrame 对象,它不应该从 MyFrame 继承,而是有一个 MyFrame 成员并以这种方式操作它(即更改文本,移动周围的东西......)。这样您就可以将视图和控制器分开
  • 不错的主意,谢谢!

标签: python class inheritance wxwidgets wxformbuilder


【解决方案1】:

如果我理解你想访问表单生成器生成的FlexGridSizer 吗?

我从未使用过wxFormBuilder,但我认为这个想法是它创建一个wxFlexGridSizer,对其进行操作以进行表单布局,并在您的wxWindow 上调用SetSizer (或 wxFrame 在你的情况下)并忘记它,因为布局不会再改变了。

一个简单的选择(但这不是最好的)是在您的框架上调用GetSizer,然后您可以从那里访问wxSizer

另一种选择是在您的 MyFrame 中有一个特定的sizer 成员,您将在其中存储wxFlexGridSizer,但这可能涉及更改wxFormBuilder 生成的代码

【讨论】:

  • 好的,我可以调查一下。我需要访问wxFlexGridSizer 的原因是因为我想在外部套接字命令调用时向它添加额外的wxStaticText 小部件,据我所知,唯一的方法是通过wxFlexGridSizer.Add() 方法.有什么建议吗?
  • wxFormBuilder 似乎非常适合快速原型制作,但对于这样的细节却不是那么好。我想我只是要建立一个初稿,然后从那里手动编辑源代码以处理细节和小的更改。我知道足够的 wx 我对此感到满意。感谢您的帮助!
  • 根据我的经验,在运行时向 sizer 添加内容可能很复杂。另一种选择是让您创建完整的小部件,包括您的附加字段。然后根据情况可以隐藏不需要的小部件(通过调用Hide())。
猜你喜欢
  • 1970-01-01
  • 2016-12-07
  • 2019-04-02
  • 2015-10-31
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2011-04-08
相关资源
最近更新 更多