2008-11-07 171 views
2

我正在学习Python和WxPython。多年来,我一直是SAS程序员。这个面向对象的东西正慢慢融合在一起,但我仍然对很多概念都很模糊。以下是一段代码。我正在尝试使用按钮单击来创建另一个类的实例。具体来说 - 我有一个班的主面板,当用户点击主面板上的一个菜单项时,我希望实例化一个辅助面板。当辅助面板只是一个功能时,我完成了所有这些工作。我似乎无法让我作为一个班级工作。如何在Python的另一个类中创建类的实例

下面是代码

import wx 

class mainPanel(wx.Frame): 
    def __init__(self, parent, id, title): 
    wx.Frame.__init__(self, parent, id, 'directEDGAR Supplemental Tools', size=(450, 450)) 
    wx.Panel(self,-1) 
    wx.StaticText(self,-1, "This is where I will describe\n the purpose of these tools",(100,10)) 


    menubar = wx.MenuBar() 
    parser = wx.Menu() 
    one =wx.MenuItem(parser,1,'&Extract Tables with One Heading or Label') 
    two =wx.MenuItem(parser,1,'&Extract Tables with Two Headings or Labels') 
    three =wx.MenuItem(parser,1,'&Extract Tables with Three Headings or Labels') 
    four =wx.MenuItem(parser,1,'&Extract Tables with Four Headings or Labels') 
    quit = wx.MenuItem(parser, 2, '&Quit\tCtrl+Q') 
    parser.AppendItem(one) 
    parser.AppendItem(two) 
    parser.AppendItem(three) 
    parser.AppendItem(four) 
    parser.AppendItem(quit) 
    menubar.Append(parser, '&Table Parsers') 

    textRip = wx.Menu() 
    section =wx.MenuItem(parser,1,'&Extract Text With Section Headings') 
    textRip.AppendItem(section) 
    menubar.Append(textRip, '&Text Rippers') 

    dataHandling = wx.Menu() 
    deHydrate =wx.MenuItem(dataHandling,1,'&Extract Data from Tables') 
    dataHandling.AppendItem(deHydrate) 
    menubar.Append(dataHandling, '&Data Extraction')   


    self.Bind(wx.EVT_MENU, self.OnQuit, id=2) 

这就是我想我是通过点击一个按钮来创建一个实例

子面板的

聪明。

self.Bind(wx.EVT_MENU, self.subPanel(None, -1, 'TEST'),id=1) 

    self.SetMenuBar(menubar) 

    self.Centre() 
    self.Show(True) 

    def OnQuit(self, event): 
    self.Close() 

class subPanel(wx.Frame): 
    def __init__(self, parent, id, title): 
    wx.Frame.__init__(self, parent, id, 'directEDGAR Supplemental Tools', size=(450, 450)) 
    wx.Panel(self,-1) 
    wx.StaticText(self,-1, "This is where I will describe\n the purpose of these tools",(100,10)) 


    getDirectory = wx.Button(panel, -1, "Get Directory Path", pos=(20,350)) 
    getDirectory.SetDefault() 

    getTerm1 = wx.Button(panel, -1, "Get Search Term", pos=(20,400)) 
    getTerm1.SetDefault() 

    #getDirectory.Bind(wx.EVT_BUTTON, getDirectory.OnClick, getDirectory.button) 


    self.Centre() 
    self.Show(True) 




app = wx.App() 
mainPanel(None, -1, '') 
app.MainLoop() 
+0

的顶部的代码块不能正确缩进。 – 2008-11-07 23:43:32

回答

0

您需要一个事件处理程序在你的绑定表达式

self.bind(wx.EVT_MENU, subPanel(None, -1, 'TEST'),id=1) 

需要被改为:

self.bind(wx.EVT_MENU, <event handler>, <id of menu item>) 

在您的事件处理程序响应事件和实例的子面板:

def OnMenuItem(self, evt): #don't forget the evt 
    sp = SubPanel(self, wx.ID_ANY, 'TEST') 
    #I assume you will add it to a sizer 
    #if you aren't... you should 
    test_sizer.Add(sp, 1, wx.EXPAND) 
    #force the frame to refresh the sizers: 
    self.Layout() 

或者,您可以实例化您的框架中的子面板__init__并调用实例化后subpanel.Hide(),然后将菜单项事件处理程序,并调用显示面板上subpanel.Show()

编辑:下面是一些代码,会做什么,我认为你是在问:

#!usr/bin/env python 

import wx 

class TestFrame(wx.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     wx.Frame.__init__(self, parent, *args, **kwargs) 
     framesizer = wx.BoxSizer(wx.VERTICAL) 
     mainpanel = MainPanel(self, wx.ID_ANY) 
     self.subpanel = SubPanel(self, wx.ID_ANY) 
     self.subpanel.Hide() 
     framesizer.Add(mainpanel, 1, wx.EXPAND) 
     framesizer.Add(self.subpanel, 1, wx.EXPAND) 
     self.SetSizerAndFit(framesizer) 

class MainPanel(wx.Panel): 
    def __init__(self, parent, *args, **kwargs): 
     wx.Panel.__init__(self, parent, *args, **kwargs) 
     panelsizer = wx.BoxSizer(wx.VERTICAL) 
     but = wx.Button(self, wx.ID_ANY, "Add") 
     self.Bind(wx.EVT_BUTTON, self.OnAdd, but) 
     self.panel_shown = False 
     panelsizer.Add(but, 0) 
     self.SetSizer(panelsizer) 

    def OnAdd(self, evt): 
     if not self.panel_shown: 
      self.GetParent().subpanel.Show() 
      self.GetParent().Fit() 
      self.GetParent().Layout() 
      self.panel_shown = True 
     else: 
      self.GetParent().subpanel.Hide() 
      self.GetParent().Fit() 
      self.GetParent().Layout() 
      self.panel_shown = False 

class SubPanel(wx.Panel): 
    def __init__(self, parent, *args, **kwargs): 
     wx.Panel.__init__(self, parent, *args, **kwargs) 
     spsizer = wx.BoxSizer(wx.VERTICAL) 
     text = wx.StaticText(self, wx.ID_ANY, label='I am a subpanel') 
     spsizer.Add(text, 1, wx.EXPAND) 
     self.SetSizer(spsizer) 

if __name__ == '__main__': 
    app = wx.App() 
    frame = TestFrame(None, wx.ID_ANY, "Test Frame") 
    frame.Show() 
    app.MainLoop() 
1

我不知道wxWidgets的,但根据我所知道的Python的,我猜你需要改变:

self.Bind(wx.EVT_MENU, self.subPanel(None, -1, 'TEST'),id=1) 

到:

self.Bind(wx.EVT_MENU, subPanel(None, -1, 'TEST'),id=1) 

“ subPanel“是全局定义的类,不是”self“(它是mainPanel)的成员。

编辑:啊,“绑定”似乎将一个动作绑定到一个函数,所以你需要给它一个创建其他类的函数。尝试以下操作。它仍然不起作用,但至少它现在在子面板创建期间崩溃。

self.Bind(wx.EVT_MENU, lambda(x): subPanel(None, -1, 'TEST'),id=1) 
1

您应该处理按钮点击事件,并在您的按钮处理程序创建面板(如您已与您OnQuit方法做)。

我认为下面的代码基本上做你以后的事情 - 当点击按钮/菜单项被选中时创建一个新的框架。

import wx 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title="My Frame", num=1): 

     self.num = num 
     wx.Frame.__init__(self, parent, -1, title) 
     panel = wx.Panel(self) 

     button = wx.Button(panel, -1, "New Panel") 
     button.SetPosition((15, 15)) 
     self.Bind(wx.EVT_BUTTON, self.OnNewPanel, button) 
     self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 

     # Now create a menu 
     menubar = wx.MenuBar() 
     self.SetMenuBar(menubar) 

     # Panel menu 
     panel_menu = wx.Menu() 

     # The menu item 
     menu_newpanel = wx.MenuItem(panel_menu, 
            wx.NewId(), 
            "&New Panel", 
            "Creates a new panel", 
            wx.ITEM_NORMAL) 
     panel_menu.AppendItem(menu_newpanel) 

     menubar.Append(panel_menu, "&Panels") 
     # Bind the menu event 
     self.Bind(wx.EVT_MENU, self.OnNewPanel, menu_newpanel) 

    def OnNewPanel(self, event): 
     panel = MyFrame(self, "Panel %s" % self.num, self.num+1) 
     panel.Show() 

    def OnCloseWindow(self, event): 
     self.Destroy() 

def main(): 
    application = wx.PySimpleApp() 
    frame = MyFrame(None) 
    frame.Show() 
    application.MainLoop() 

if __name__ == "__main__": 
    main() 

编辑:增加了代码,从菜单中执行此操作。

相关问题