2012-04-06 4 views
1

So habe ich den folgenden Code festgelegt, um das Problem zu demonstrieren:WxPython: TextCtrl nicht immer Fokus, wenn innerhalb einer Platte in einem anderen Panel innerhalb eines Rahmens erhalten

import wx 


class testPanel(wx.Panel): 
    def __init__(self, parent): 
     super(testPanel, self).__init__(parent) 
     self.hsizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.txt = wx.TextCtrl(self, style=wx.TE_MULTILINE) 

     self.hsizer.Add(self.txt, proportion=1, 
      flag=wx.EXPAND) 
     self.SetSizer(self.hsizer) 

     self.hsizer.Fit(self) 
     self.Show(True) 


class testFrame(wx.Frame): 
    def __init__(self, parent): 
     super(testFrame, self).__init__(parent) 
     self.mainPanel = wx.Panel(self) 
     self.vsizer = wx.BoxSizer(wx.VERTICAL) 

     self.txt1 = testPanel(self) 
     self.txt2 = testPanel(self) 

     self.vsizer.Add(self.txt1, proportion=1, 
      flag=wx.EXPAND) 
     self.vsizer.Add(self.txt2, proportion=1, 
      flag=wx.EXPAND) 
     self.mainPanel.SetSizer(self.vsizer) 

     self.vsizer.Fit(self.mainPanel) 

     self.mainSizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.mainSizer.Add(self.mainPanel, proportion=1, 
      flag=wx.EXPAND) 
     self.SetSizer(self.mainSizer) 
     self.mainSizer.Fit(self) 

     self.Show(True) 

app = wx.PySimpleApp() 
frame = testFrame(None) 
frame.Show(True) 
app.MainLoop() 

Wenn dies ausgeführt wird, alles zeigt, wie erwartet, aber die zwei wx.TextCtrls werden nie den Fokus erhalten. Dies ist nicht der Fall, wenn die zusätzliche Schicht der Platte entfernt wird, aber ich kann nicht vermeiden, diese zusätzliche Platte zu haben.

Antwort

1

Verwendung:

self.txt1 = testPanel(self.mainPanel) 
self.txt2 = testPanel(self.mainPanel) 

und sie werden scharf eingestellt werden.

In wxPython geht es besser, wenn Sie eine lineare Vererbungslinie mit Verzweigungen, aber ohne Überkreuzungen entwerfen. Da sich Ihre testPanels in einem Sizer befinden, der zu mainPanel gehört, ist das natürliche übergeordnete Element nicht der Frame (self), sondern mainPanel,