1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Windows10でwxpython使ったらdatetime.datetime.strptimeで「ValueError: unknown locale: ja-JP」

Posted at

wxpython使ってWindows向けGUIを作ってみていたのですが、
「application = wx.App()」とした後に
「datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S')」としたら
「ValueError: unknown locale: ja-JP」となってしまいました。

デバッグで追っていったところwx.App()をするとイニシャル処理で「InitLocale()」が実行されて
「self._initial_locale = wx.Locale(wx.LANGUAGE_DEFAULT)」
と処理されて実行OSのlocaleが設定されるようなのですが・・・
https://docs.wxpython.org/wx.Language.enumeration.html
それが「ja_JP」となるようです。

「ja_JP.UTF8」とかじゃなくて「ja_JP」です。

localeに「ja_JP」が設定されている状態で
「locale.getlocale(locale.LC_TIME)」とかやると
(datetime.datetime.strptimeの中で実行されます。)
「ValueError: unknown locale: ja-JP」とエラーになります。

「ja_JP.UTF8」がセットされていれば
「ValueError: time data '20/Aug/2020:17:28:00' does not match format '%d/%b/%Y:%H:%M:%S'」というエラーになるのですが、そこまでたどり着くこともありません。

環境情報

OS: Windows 10
Python: 3.7.7

事象の再現と解消・・・というかとりあえず回避

事象再現と解消
import datetime
import wx

def test_func1(self):

    print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))

def test_func2(self):

    application.ResetLocale()

    print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))

    application.InitLocale()

if __name__ == '__main__':

    application = wx.App()

    frame = wx.Frame(None, wx.ID_ANY, title='test')

    exechg_button1 = wx.Button(frame, wx.ID_ANY, 'エラー発生')
    exechg_button2 = wx.Button(frame, wx.ID_ANY, 'エラー回避')

    exechg_button1.Bind(wx.EVT_BUTTON, test_func1)
    exechg_button2.Bind(wx.EVT_BUTTON, test_func2)

    frame_sizer = wx.BoxSizer(wx.VERTICAL)
    frame_sizer.Add(exechg_button1)
    frame_sizer.Add(exechg_button2)
    frame.SetSizer(frame_sizer)

    frame.Show()
    application.MainLoop()

「エラー発生」ボタンを押すと再現します。
「エラー回避」は解消というか回避案です。
ここではwx.APPで用意されている「InitLocale()」「ResetLocale()」を使用して回避しました。
https://wxpython.org/Phoenix/docs/html/wx.App.html

wx.APP()のイニシャル処理で設定されるロケールは「ResetLocale()」で元に戻せるようなので、「datetime.datetime.strptime」のようにlocaleの影響を意識しなければいけない処理に入る前に「ResetLocale()」して完了次第「InitLocale()」するようにしました。

「ResetLocale()」ではなく
「locale.setlocale(locale.LC_TIME, 'C')」と直接locale設定しても良かったのですが(というかそもそもlocaleを意識しなければいけない処理なので、それはそれで正しいかと思いますが)せっかくなのでwx.APPで用意してくれている「ResetLocale()」のみで対応しました。

私のWindows10環境でwxpython利用した際にlocaleを「ja_JP」ではなく「ja_JP.UTF8」にするにはどうすればいいのだろうか。

悩み中

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?