2013-05-12 80 views
0

我是wxPython的新手,并且研究过类似的问题,但无法专门找到我的问题的答案。我正在用分离器创建两个面板。每个面板都有一些小部件。我希望在一个面板中有一个小部件控制另一个面板的某些属性,反之亦然)wx.Python:在多个面板之间传递控制

在此示例中,我试图从LeftPanel中的按钮更改背景RightPanel。我明明做错事的我得到一个错误:

TypeError: init() takes exactly 2 arguments (1 given)

代码:

import wx 
import wx.grid as gridlib 
import pyodbc 

class RightPanel(wx.Panel): 
"""""" 

def __init__(self, parent): 
    """Constructor""" 
    wx.Panel.__init__(self, parent=parent)   

    grid = gridlib.Grid(self) 
    grid.CreateGrid(5,5) 

    sizer = wx.BoxSizer(wx.VERTICAL) 
    sizer.Add(grid, 0, wx.EXPAND) 
    self.SetSizer(sizer) 

class LeftPanel(wx.Panel): 
"""""" 

def __init__(self, parent): 
    """Constructor""" 
    wx.Panel.__init__(self, parent=parent) 

    self.create_controls() 
    self.SetBackgroundColour("light green") 

def create_controls(self): 

    self.h_sizer = wx.BoxSizer(wx.HORIZONTAL) 
    self.v_sizer = wx.BoxSizer(wx.VERTICAL) 

    self.button = wx.Button(self, label="Press me!") 
    self.button.Bind(wx.EVT_BUTTON, self.on_button_pressed)  

    self.v_sizer.Add(self.button, 0) 

    self.v_sizer.Add(self.h_sizer, 0, wx.EXPAND) 
    self.SetSizer(self.v_sizer) 

def on_button_pressed(Panel,event): 

     RightPanel().SetBackgroundColour("light blue") 

class MyForm(wx.Frame): 

def __init__(self): 
    wx.Frame.__init__(self, None, wx.ID_ANY, "DB Viewer",size=(350, 250)) 

    splitter = wx.SplitterWindow(self) 
    leftP = LeftPanel(splitter) 
    rightP = RightPanel(splitter) 

    splitter.SplitVertically(leftP, rightP) 
    splitter.SetMinimumPaneSize(20) 

    sizer = wx.BoxSizer(wx.VERTICAL) 
    sizer.Add(splitter, 1, wx.EXPAND) 
    self.SetSizer(sizer) 

if __name__ == "__main__": 
app = wx.App(False) 
frame = MyForm() 
frame.Show() 
app.MainLoop() 

任何帮助极大的赞赏。问候

回答

0

在你的代码有

def on_button_pressed(Panel,event): 

    RightPanel().SetBackgroundColour("light blue") 

在定义“小组”应该是“自我”为“on_button_pressed”是一个实例方法

然后你要创建一个新RightPanel而不是存取权限的已经创建的实例。

我将绑定移动到父框架,以便它可以调用另一个子面板上的方法。 请参阅下面的修改后的代码。

import wx 
import wx.grid as gridlib 
# import pyodbc 


class RightPanel(wx.Panel): 
    """""" 

    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 

     grid = gridlib.Grid(self) 
     grid.CreateGrid(5, 5) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(grid, 0, wx.EXPAND) 
     self.SetSizer(sizer) 


class LeftPanel(wx.Panel): 
    """""" 

    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 

     self.create_controls() 
     self.SetBackgroundColour("light green") 

    def create_controls(self): 

     self.h_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.v_sizer = wx.BoxSizer(wx.VERTICAL) 

     self.button = wx.Button(self, label="Press me!") 

     self.v_sizer.Add(self.button, 0) 

     self.v_sizer.Add(self.h_sizer, 0, wx.EXPAND) 
     self.SetSizer(self.v_sizer) 


class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "DB Viewer", size=(350, 250)) 

     splitter = wx.SplitterWindow(self) 
     leftP = LeftPanel(splitter) 
     self.rightP = RightPanel(splitter) 

     splitter.SplitVertically(leftP, self.rightP) 
     splitter.SetMinimumPaneSize(20) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(splitter, 1, wx.EXPAND) 
     self.SetSizer(sizer) 

     leftP.button.Bind(wx.EVT_BUTTON, self.on_button_pressed) 

     self.Layout() 

    def on_button_pressed(self, event): 
      self.rightP.SetBackgroundColour("light blue") 
      self.Refresh() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 
+0

绝对的辉煌!它整个周末一直在努力。非常感谢你。我还可以问,这个工作是否将文本传输到网格中。我的意思是,如果我在左侧面板上有一个txtctrl;按钮事件是否能够在MyForm中读取它,并将其放置到RightPanel网格中? – user2374378 2013-05-12 23:07:05

2

一个干净的设计,可以实现利用发布订阅:

import wx 
import wx.grid as gridlib 
from wx.lib.pubsub import pub 

#import pyodbc 

class RightPanel(wx.Panel): 
    """""" 

    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent)   

     grid = gridlib.Grid(self) 
     grid.CreateGrid(5,5) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(grid, 0, wx.EXPAND) 
     self.SetSizer(sizer) 

     pub.subscribe(self.changeColourEvent, "MOOD_CHANGE") 


    def changeColourEvent(self, value): 
     self.SetBackgroundColour(value) 
     self.Refresh() 


class LeftPanel(wx.Panel): 
    """""" 

    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 

     self.create_controls() 
     self.SetBackgroundColour("grey") 


    def create_controls(self): 

     self.h_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.v_sizer = wx.BoxSizer(wx.VERTICAL) 

     self.bbutton = wx.Button(self, label="Got dem blues?!") 
     self.bbutton.Bind(wx.EVT_BUTTON, self.blues_button_pressed)  

     self.hbutton = wx.Button(self, label="Happy happy!") 
     self.hbutton.Bind(wx.EVT_BUTTON, self.happy_button_pressed)  

     self.v_sizer.Add(self.bbutton, 0) 
     self.v_sizer.Add(self.hbutton, 0) 

     self.v_sizer.Add(self.h_sizer, 0, wx.EXPAND) 
     self.SetSizer(self.v_sizer) 


    def blues_button_pressed(self,event): 
     pub.sendMessage("MOOD_CHANGE", value = "blue")   


    def happy_button_pressed(self,event): 
     pub.sendMessage("MOOD_CHANGE", value = "yellow")   


class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "DB Viewer",size=(350, 250)) 

     splitter = wx.SplitterWindow(self) 
     leftP = LeftPanel(splitter) 
     rightP = RightPanel(splitter) 

     splitter.SplitVertically(leftP, rightP) 
     splitter.SetMinimumPaneSize(20) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(splitter, 1, wx.EXPAND) 
     self.SetSizer(sizer) 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

认为这种做法带来的是,它意味着没有窗格是依赖于任何其他窗格的设计优势。您可以看到,无论是MyForm还是RightPanel都不需要知道LeftPanel是否正在决定是时候根据按钮或复选框或任何其他机制来更改颜色。在这段代码中,MyForm只关心实例化两个窗格。它并不会纠缠在它们之间的逻辑之中。

它也很容易扩展的对象(在这种情况下,窗格)可以传递给对方的信息类型。

它还允许将其他元素添加到关注相同种类的事物(在我的示例中为情绪变化)的设计中,而不影响除自身以外的任何其他代码。