首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython: wxFormBuilder生成的图形用户界面访问测试器

wxPython: wxFormBuilder生成的图形用户界面访问测试器
EN

Stack Overflow用户
提问于 2015-05-15 07:41:53
回答 1查看 1.1K关注 0票数 0

我想在MVC的理念下,用独立的GUI和控制器来开发我的应用程序。此外,在图形任务方面,我有一个比我好得多的同事,我们希望分发工作:他用wxFormBuilder构建图形部分,我构建应用程序的“机器”。

当我生成GUI时,我希望替代一些wxFormbuilder无法管理的元素:例如,wxObjectListView。我的想法是用一个普通的wxListBox创建一个GUI,用主程序导入它,然后用一个wxObjectListView代替它。我不想直接修改wxFormBuilder生成的代码,因为我想保持与GUI编辑器的向后兼容性。

问题和问题是:从导入GUI的主程序中,如何访问包含列表、删除和由ObjectListView替换的sizer?类似于sizer.Delete(列表)和sizer.Add(Olv).

这里就是一个例子:

wxFormBuilder生成的图形用户界面代码:带有列表和按钮的框架。

代码语言:javascript
复制
# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Sep  8 2010)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx

###########################################################################
## Class MyFrame1
###########################################################################

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 330,288 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        fgSizer = wx.FlexGridSizer( 2, 1, 0, 0 )
        fgSizer.AddGrowableCol( 0 )
        fgSizer.AddGrowableRow( 0 )
        fgSizer.SetFlexibleDirection( wx.BOTH )
        fgSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )

        m_listBox1Choices = [ u"Row1", u"Row2" ]
        self.m_listBox1 = wx.ListBox( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_listBox1Choices, 0 )
        fgSizer.Add( self.m_listBox1, 1, wx.ALL|wx.EXPAND, 5 )

        self.m_button1 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
        fgSizer.Add( self.m_button1, 1, wx.ALL|wx.EXPAND, 5 )

        self.SetSizer( fgSizer )
        self.Layout()

        self.Centre( wx.BOTH )

    def __del__( self ):
        pass

这是导入图形类的主要代码。

代码语言:javascript
复制
from __future__ import print_function
# -*- coding: utf-8 -*-
import wx
from olvGUI import MyFrame1

class Ventana(MyFrame1):

    def inicia(self):
        hijos = self.GetChildren()
        for h in hijos:
            print(h)


if __name__ == "__main__":
    app = wx.App(False)
    v = Ventana(None)
    v.inicia()
    v.Show()
    app.MainLoop()

当我试图访问框架子对象时,我只看到了“最终”对象,而没有看到Sizer。

代码语言:javascript
复制
<wx._controls.ListBox; proxy of <Swig Object of type 'wxListBox *' at 0x1e0cea8> >
<wx._controls.Button; proxy of <Swig Object of type 'wxButton *' at 0x19a5f90> >

也许GUI必须有另一个结构,如果我想让它成为他的元素可访问,但我不知道如何使它。我试过做两个等级的筛子,最终的结果是一样的:我可以访问最终的元素,而不是测量器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 13:51:49

您需要将fgSizer更改为self.fgSizer,以便以后可以访问它。然后,您可以使用sizer的Remove方法来删除小部件。有一个Insert方法可以用来在它的位置插入另一个小部件。

有关详细信息,请参阅有关sizer的文档:

  • http://www.wxpython.org/docs/api/wx.Sizer-class.html

因为要删除和插入一个小部件,所以很可能需要在该方法的末尾调用Layout。本文有一个例子:

  • http://www.blog.pythonlibrary.org/2012/05/05/wxpython-adding-and-removing-widgets-dynamically/

最后,下面是一个获取sizer的示例:

代码语言:javascript
复制
import wx

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title='Test')
        self.panel = wx.Panel(self)

        sizer = wx.BoxSizer(wx.VERTICAL)

        btn = wx.Button(self.panel, label="Get sizer")
        btn.Bind(wx.EVT_BUTTON, self.onGetSizer)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        self.panel.SetSizer(sizer)

        self.Show()

    #----------------------------------------------------------------------
    def onGetSizer(self, event):
        """"""
        sizer = self.panel.GetSizer()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

下面是保存小部件索引的示例:

代码语言:javascript
复制
self.widget_dict = {}
some_boxsizer.Add(some_widget)  # this is the first widget, so its ID is zero
self.widget_dict[some_widget] = 0

现在,在您的事件处理程序中,您可以使用此字典来确定哪个小部件在哪个索引中:

代码语言:javascript
复制
index = self.widget_dict[some_widget]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30254155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档