#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. Я научился на собственном горьком опыте 🙂