2016-09-23 13 views
2

私は、Python 3.52とQt5に基づくグラフィカルユーザインタフェースを使用してファイルから時間を読み取るツールを書いていました。最小操作PyQt5とdatetime.datetime.strptimeとの間の競合

​​3210

出力は "1900-01-01 00:00:00"という出力を与えます。私は、次の最小限の例

import sys 
import datetime as datetime 

from PyQt5 import QtWidgets 

if __name__ == '__main__' : 
    print(datetime.datetime.strptime('Tue', '%a')) 
    app = QtWidgets.QApplication(sys.argv) 
    print(datetime.datetime.strptime('Tue', '%a')) 
    #sys.exit(app.exec_()) 

を実行したときしかし、私は、出力

1900-01-01 00:00:00 
Traceback (most recent call last): 
File "/home/user/gui/testfile.py", line 11, in <module> 
print(datetime.datetime.strptime('Tue', '%a')) 
File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime 
tt, fraction = _strptime(data_string, format) 
File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime 
(data_string, format)) 
ValueError: time data 'Tue' does not match format '%a' 

だから、のstrptimeルーチンへの最初の呼び出しが正常に動作しますが、はQApplicationクラスが作成された後に取得しますそれ以上は動作しません。さらに QApplicationを使用してGUIを構築し、それを使って多くの複雑なことを行うことに注意してください。現在動作しないのは strptime

何が問題になるのでしょうか?

+0

によって強制ローカライズを元に戻す方法を発見した、それがクラッシュしませんここで(3.5.1 x64、QT_VERSION_STR = 5.7.0、PYQT_VERSION_STR = 5.7、win7) – BPL

答えて

1

私はあなたの問題を再現することができます:QtWidget、エラーで

print(datetime.datetime.strptime('Tue', '%a'))

結果を呼び出した後。

私はQtWidget

print(datetime.datetime.strptime('Die', '%a')) 後に実行した場合、これは動作します。

私はスイスにありますので、ドイツ語は、Tueに相当します。

Qtは地域設定に何らかの影響を与えているようです(%A)。%aは地方の曜日の名前(Datetime)を評価しています。たぶん、Qtのエキスパートがもっと詳しく説明できます。パトリックによって素敵な答えに詳しく説明し

+0

うわー、誰が考えていただろう... –

+0

おそらく['setlocale(LC_ALL、 '')'](https:// linux .die.net/man/3/setlocale)または同等のものであることを確認してください。 – mata

0

、私は今、私はあなたのスクリプトを試してみたと私は再現することはできませんQT

import sys 
import datetime as datetime 
import locale 

from PyQt5 import QtWidgets 

## Start the QT window 
print(datetime.datetime.strptime('Tue', '%a')) 
app = QtWidgets.QApplication(sys.argv) 
locale.setlocale(locale.LC_TIME, "en_GB.utf8") 
print(datetime.datetime.strptime('Tue', '%a')) 
#sys.exit(app.exec_()) 
+0

これは 'en_GB.utf8'ロケールがosにインストールされている場合にのみ有効です。そうでない場合は例外が発生します。 [プログラムの起動時のデフォルト](https://linux.die.net/man/3/setlocale)は 'C'ロケールなので、移植するにはそれを使いたいかもしれません。 – mata

関連する問題