我正在使用 wxPython wx.adv.DatePickerCtrl ,它将日期显示为“mm dd yyyy”。我想要“dd mm yyyy”。我怎样才能做到这一点?我在docs
中看不到任何内容如果我在命令行(nix)上使用“日期”,我会得到
2022 年 7 月 2 日星期六 14:15:03 BST
import wx
import wx.adv
import datetime
class MainFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super().__init__(None, *args, **kwargs)
self.Title = 'Date format'
self.panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Center()
self.Show()
class MainPanel(wx.Panel):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
date_picker = wx.adv.DatePickerCtrl(self)
date_picker.SetValue(datetime.date.today())
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(date_picker)
self.SetSizer(sizer)
if __name__ == '__main__':
wx_app = wx.App()
MainFrame()
wx_app.MainLoop()
随着时间的推移,我意识到明显需要该控件的更灵活版本。我编写了一个控件,允许从使用 wx.adv.CalendarCtrl 的对话框中选取日期。
可以使用 date 属性设置控件中日期的初始值,并使用 format 属性设置格式。可以在事件 EVT_DATE_CHANGED 中捕获日期的更改;日期位于事件处理程序的 event.attr1 中。
我已经包含了 DatePicker 的代码以及用于测试它的屏幕
日期选择器.py
import wx, wx.adv
import wx.lib.newevent
import datetime
BORDER = 5
date_change_event, EVT_DATE_CHANGED = wx.lib.newevent.NewEvent()
class DatePicker(wx.Panel):
"""A date picker control."""
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self._format = '%Y-%m-%d'
self._date = datetime.datetime.today()
date_str = self._date.strftime(self.format)
self.txt_date = wx.TextCtrl(self)
self.txt_date.SetValue(date_str)
btn_date = wx.Button(self, label='...')
btn_date.Bind(wx.EVT_BUTTON, self.show_dialog)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.txt_date, flag=wx.RIGHT, border=BORDER)
sizer.Add(btn_date)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sizer, flag=wx.ALL, border=BORDER)
self.SetSizer(main_sizer)
def show_dialog(self, event):
"""Show the dialog and update the textctrl."""
date_dialog = _DateDialog(self)
with date_dialog:
if date_dialog.ShowModal() == wx.ID_CANCEL:
return
if date_dialog.date:
self._date = date_dialog.date
self._set_date_value()
evt = date_change_event(attr1=self._date)
wx.PostEvent(self, evt)
@property
def format(self):
return self._format
@format.setter
def format(self, value):
"""Set the date format in standard form."""
self._format = value
if self._date:
self._set_date_value()
@property
def date(self):
return self._date
@date.setter
def date(self, value):
"""Set the date."""
if not isinstance(value, datetime.datetime):
return
self._date = value
if self._date:
self._set_date_value()
def _set_date_value(self):
"""Set the value of txt_date."""
date_str = self._date.strftime(self._format)
self.txt_date.SetValue(date_str)
class _DateDialog(wx.Dialog):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.date = None
self.Title = 'Select date'
self.calendar = wx.adv.CalendarCtrl(self, date=parent.date)
self.calendar.Bind(wx.adv.EVT_CALENDAR_SEL_CHANGED, self.date_change)
button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.calendar, flag= wx.BOTTOM, border=BORDER)
sizer.Add(button_sizer, flag=wx.EXPAND)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sizer, flag=wx.ALL, border=BORDER)
self.SetSizerAndFit(main_sizer)
def date_change(self, event):
date_format = '%d/%m/%y %H:%M:%S'
date_str = self.calendar.GetDate()
date = date_str.Format(date_format)
self.date = datetime.datetime.strptime(date, date_format)
test_datepicker.py
"""Display a DatePicker object."""
import wx
from datepicker import DatePicker
class MainFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super().__init__(None, *args, **kwargs)
self.Title = 'Test DatePicker'
self.panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Center()
self.Show()
class MainPanel(wx.Panel):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
date_picker = DatePicker(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(date_picker)
self.SetSizer(sizer)
if __name__ == '__main__':
wx_app = wx.App()
MainFrame()
wx_app.MainLoop()
由于 wxPython 的目标是真正的本机用户界面,控件使用用户系统格式(在 Windows 上,f.i. 时间和语言、区域格式数据)