wx.adv.CalendarCtrl в wxPython не работает с сайзерами

#python-3.x #wxpython

Вопрос:

Мне нужно было бы добавить календарь в мою небольшую утилиту. У меня есть такой код hello world, как этот:

 import wx
import wx.stc as stc
import wx.adv as adv

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='My fancy form app with calendar')
        panel = wx.Panel(self)
        my_sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetMinSize(wx.Size(400,450))

        # Headline Text
        self.headline_text = wx.StaticText(panel, style = wx.TE_CENTER amp; ~wx.TE_LEFT amp; ~wx.TE_RIGHT, label="This text will be placed to the top of my form")
        my_sizer.Add(self.headline_text, 0, wx.ALL | wx.EXPAND, 5)

        # Calendar under the text
        self.cal = adv.CalendarCtrl(self, 10, wx.DateTime.Now())
        my_sizer.Add(self.cal, 0, wx.ALL | wx.CENTER, 5)


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

Без блока кода с календарем это работает хорошо. BoxSizer может размещать кнопки, текстовые надписи, таблицы и т.д. — Но календарь убивает калибровщик, и все находится в верхнем левом углу.

Итак, пожалуйста, как правильно использовать объект CalendarCtrl? Спасибо!

Ответ №1:

Вы помещали календарь на рамку

 self.cal = adv.CalendarCtrl(self ...
 

и текст на панели

 self.headline_text = wx.StaticText(panel ...
 
  • все виджеты действительно должны размещаться на панелях.

Я также переместил все ваши виджеты в класс панели, который помогает разделять проблемы

 import wx
import wx.stc as stc
import wx.adv as adv

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='My fancy form app with calendar')
        panel = wx.Panel(self)
        self.SetMinSize(wx.Size(400,450))
        self.panel = MainPanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel)
        self.SetSizer(sizer)
        self.Center()
        self.Show()

class MainPanel(wx.Panel):
    """Create a panel class to contain screen widgets."""
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        sizer = wx.BoxSizer(wx.VERTICAL)
        # Headline Text
        self.headline_text = wx.StaticText(self, style = wx.TE_CENTER amp; ~wx.TE_LEFT amp; ~wx.TE_RIGHT, label="This text will be placed to the top of my form")
        sizer.Add(self.headline_text, 0, wx.ALL | wx.EXPAND, 5)

        # Calendar under the text
        self.cal = adv.CalendarCtrl(self, 10, wx.DateTime.Now())
        sizer.Add(self.cal, 0, wx.ALL | wx.CENTER, 5)
        self.SetSizer(sizer)


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

введите описание изображения здесь

Комментарии:

1. Большое спасибо, я не понимаю, как я это пропустил

2. Ha. Ha. Я научился на собственном горьком опыте 🙂