如何设置wx.adv.DatePickerCtrl的日期格式为dd mm yyyy
wx.adv.DatePickerCtrl 修改日期显示格式为dd mm yyyy的方法
核心原因
wx.adv.DatePickerCtrl是对操作系统原生日期选择组件的封装,默认显示格式完全跟随当前系统的区域短日期配置,控件本身未暴露单独修改显示格式的公开API,因此在官方文档中找不到对应配置项是正常情况。
你在类Unix命令行执行date得到的是系统长日期输出,和控件读取的短日期区域配置不是同一项。
可用实现方案
- 方案1:临时指定程序locale,无需修改系统全局设置
类Unix环境下,控件初始化时会读取当前进程的LC_TIME区域配置来决定日期格式,你只需要在初始化控件前,将进程的时间区域设置为使用dd mm yyyy格式的区域即可(比如英式英语en_GB.UTF-8,和你命令行输出的BST英国夏令时环境匹配)。
修正后的完整可运行代码:
import wx import wx.adv import datetime import locale 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) # 初始化控件前设置时间区域为dd/mm/yyyy格式的英式英语 try: locale.setlocale(locale.LC_TIME, 'en_GB.UTF-8') except locale.Error: # 兜底:若系统未生成en_GB区域,可替换为locale -a列出的其他dd/mm/yyyy格式区域 locale.setlocale(locale.LC_TIME, 'C.UTF-8') 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()
提示:如果
en_GB.UTF-8设置报错,可以在终端执行locale -a查看当前系统已生成的所有区域列表,选择短日期规则为日/月/年的区域即可。
- 方案2:替换为支持自定义格式的纯Python日期控件
如果不想修改程序locale,或者需要完全自定义日期显示格式(比如自定义分隔符、固定位数),可以直接使用wxPython内置的wx.lib.masked.DateCtrl控件。该控件不依赖系统原生组件,支持直接传入格式字符串指定显示规则,使用逻辑和原生DatePickerCtrl基本一致。
核心调用代码:
from wx.lib.masked import DateCtrl # 直接指定格式为 两位日 两位月 四位年,分隔符可自行替换为空格、斜杠、横杠等 date_picker = DateCtrl(self, formatfmt='%d %m %Y')
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

