如何在wx.adv.DatePickerCtrl上设置日期格式

问题描述 投票:0回答:2

我正在使用 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()
wxpython
2个回答
1
投票

随着时间的推移,我意识到明显需要该控件的更灵活版本。我编写了一个控件,允许从使用 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()

0
投票

由于 wxPython 的目标是真正的本机用户界面,控件使用用户系统格式(在 Windows 上,f.i. 时间和语言、区域格式数据

© www.soinside.com 2019 - 2024. All rights reserved.