2015-03-04 4 views
1

В моей программе WxPython моя панель ведет себя по-разному в зависимости от того, я делаю это производный класс или экземпляр прямо панель:Производные классы панели в WxPython

 
import wx 

class PanelWithText(wx.Panel): 
    def __init__(self, parent): 
     super(PanelWithText, self).__init__(parent) 

     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     panel1 = wx.Panel(parent) 
     st1 = wx.StaticText(panel1, label='Some Text') 
     hbox1.Add(st1) 

class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title=title, 
      size=(390, 350)) 

     panel = wx.Panel(self) 

     vbox = wx.BoxSizer(wx.VERTICAL) 

     hbox1 = wx.BoxSizer(wx.HORIZONTAL)     # comment out from here 
     panel1 = wx.Panel(panel)       # 
     st1 = wx.StaticText(panel1, label='Some Text')  # 
     hbox1.Add(st1)          # to here 
     # panel1 = PanelWithText(panel) 
     vbox.Add(panel1) 

     panel.SetSizer(vbox) 

     self.Centre() 
     self.Show() 

if __name__ == '__main__': 

    app = wx.App() 
    Example(None, title='Example') 
    app.MainLoop() 

Если я запускаю его как есть, она выглядит хорошо , Если я запустил его, прокомментировав четыре строки, которые создают панель1 и раскомментируют строку, которая создает панель1 с использованием производного класса, «Some Text» получает обрезание и отображает только «Sor». Хуже того, когда я делаю нетривиальную программу.

Эти два, кажется, идентичны мне. В чем разница?

Я использую: Python 2.7.6 WxPython 3.0.0.0 Mac Yosemite 10.10.2

ответ

1

Проблема заключается в воспитании детей. Проблема в том, что в первом примере у вас есть родительский набор виджетов StaticText правильно panel1. В вашем классе PanelWithText вы устанавливаете родительский элемент на панель верхнего уровня вместо класса панели, что неверно. Вот пример:

import wx 

class PanelWithText(wx.Panel): 
    def __init__(self, parent): 
     super(PanelWithText, self).__init__(parent) 

     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     st1 = wx.StaticText(self, label='Some Text') 
     hbox1.Add(st1) 

class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title=title, 
      size=(390, 350)) 

     panel = wx.Panel(self) 

     vbox = wx.BoxSizer(wx.VERTICAL) 

     #hbox1 = wx.BoxSizer(wx.HORIZONTAL)     # comment out from here 
     #panel1 = wx.Panel(panel)       # 
     #st1 = wx.StaticText(panel1, label='Some Text')  # 
     #hbox1.Add(st1)          # to here 
     panel1 = PanelWithText(panel) 
     vbox.Add(panel1) 

     panel.SetSizer(vbox) 

     self.Centre() 
     self.Show() 

if __name__ == '__main__': 
    import wx.lib.mixins.inspection 
    app = wx.App() 
    Example(None, title='Example') 
    wx.lib.inspection.InspectionTool().Show() 
    app.MainLoop() 
+0

Спасибо, что конечно работает! Чтобы подробно рассказать о любых будущих читателях (что потребовалось мне несколько минут, чтобы понять), моя версия класса создала третью панель (одну в основном фрейме, одну как класс и одну внутри класса), и третий из них перепутал второй. Устранение третьей панели и привязка текста ко второму решению этой проблемы. – ericksonla

+1

Да, у вас было много вложенных панелей. Я смог понять это с помощью инструмента проверки виджетов, который показал мне, что на верхнем уровне есть пара панелей, когда должен быть только один. Вы можете проверить эту удобную утилиту: http://wiki.wxpython.org/Widget%20Inspection%20Tool –

Смежные вопросы