0

我在做什么

我正在 Windows 10 工作站的远程 Fedora 服务器上编写 Python 程序(前端:tkinter,后端:Python 3.6)。MobaXterm 有时会在出现异常后停止显示您键入的内容,因此我决定测试适用于 Linux 的 Windows 子系统。

简要问题描述

使用 MobaXterm 执行 GUI 时,它会启动,当从子系统执行它时,我收到“AttributeError:'NoneType' 对象没有属性 'days'”错误。

系统信息

服务器详情

NAME=Fedora
VERSION="27 (Twenty Seven)"
ID=fedora
VERSION_ID=27
PRETTY_NAME="Fedora 27 (Twenty Seven)"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:fedoraproject:fedora:27"
HOME_URL="fedoraproject" !!!Link removed because of SPAM flag!!!
SUPPORT_URL=!!!Link removed because of SPAM flag!!!
BUG_REPORT_URL=!!!Link removed because of SPAM flag!!!
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=27
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=27
PRIVACY_POLICY_URL= !!!Link removed because of SPAM flag!!!

子系统详细信息

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL=!!!Link removed because of SPAM flag!!!
SUPPORT_URL=!!!Link removed because of SPAM flag!!!
BUG_REPORT_URL=!!!Link removed because of SPAM flag!!!
PRIVACY_POLICY_URL=!!!Link removed because of SPAM flag!!!
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

一般信息

MobaXterm

个人版 v11.1 Build 3860

从 Fedora 服务器到 Ubuntu 子系统的 X11 转发

使用 VcXsrv(vvcxsrv-64.1.20.1.4) 完成

Windows 10 上的导出已经过测试,并且可以在其他程序上运行(使用 xeyes、firefox 和 display 进行测试)

export DISPLAY=localhost:0.0

我创建了生成问题的代码的简化版本。如果您将以下代码复制并粘贴到 python 实时终端中,它将执行。

这是一个可以更改的日历,单击日历左侧的日期可以将日期重置为当前日期。它适用于 MobaXterm,并在连接时出错

ssh -X -l username server.yourdomain.com

使用适用于 Linux 的 Windows 子系统。

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkcalendar import Calendar, DateEntry
from datetime import date

# Update the dates in the date_picker variable as well as the date variable
def update_dates(date_frame_container):

    date_frame_container['date_picker'].set_date(date.today())
    date_frame_container['date'] = date_frame_container['date_picker'].get_date()

 # Create an instance of the datepicker and place it on the tab
def setup_date_picker(date_frame_container):

    calendar_style = ttk.Style(date_frame_container['frame'])
    calendar_style.theme_use('clam')

    date_frame_container['date_label'] = ttk.Label(
            date_frame_container['frame'],
            anchor='w',
            text='Today: %s' % date.today().strftime('%x'))
    date_frame_container['date_label'].pack(side = LEFT, anchor = 'w', fill='x')

    date_frame_container['date_picker'] = DateEntry(date_frame_container['frame'])
    date_frame_container['date_picker'].pack(side = RIGHT, anchor = 'e', padx = 10, pady = 10)

    date_frame_container['date_label'].bind("<Button-1>", lambda e : update_dates(date_frame_container))


input_values = {'batch_file': '',
                'scene_id': '',
                'date_frame_container': {
                      'frame': '',
                      'date_picker': '',
                      'date_label': '',
                      'date': ''},
                'lat': '',
                'lon': '',
                'surface_temp': ''}

master = Tk()
master.geometry('320x200')
master.option_add('*tearOff', False)
input_values['date_frame_container']['frame'] = ttk.Frame(master)
input_values['date_frame_container']['frame'].grid(row = 0, column = 1, padx = 10, pady = 10, sticky = 'e')
setup_date_picker(input_values['date_frame_container'])

错误

使用 MobaXterm 运行代码时,它可以工作。

使用 ssh 和子系统运行代码时,它不起作用,并且出现AttributeError: 'NoneType' object has no attribute 'days'错误

完整的 Traceback 如下

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in setup_date_picker
  File "/usr/local/lib/python3.6/site-packages/tkcalendar/dateentry.py", line 93, in __init__
    self._calendar = Calendar(self._top_cal, **kw)
  File "/usr/local/lib/python3.6/site-packages/tkcalendar/calendar_.py", line 211, in __init__
    self._day_names = get_day_names('abbreviated', locale=locale)
  File "/usr/lib/python3.6/site-packages/babel/dates.py", line 305, in get_day_names
    return Locale.parse(locale).days[context][width]
AttributeError: 'NoneType' object has no attribute 'days'

为什么会发生这种情况,我该如何解决?该程序需要在所有环境中运行(它适用于大学的研究团队,需要学​​生和科学家使用您能想到的所有操作系统)

4

1 回答 1

0

就像 Bryan Oakley 所说,这是语言环境的问题,tkcalendar 尝试确定默认语言环境,但没有找到任何语言环境,因此将语言环境设置为None. 因此,任何日期格式的尝试都会失败。

我在持续集成平台上测试 tkcalendar 时遇到了这个错误,因此下一个版本的 tkcalendar (v1.5.0) 将通过设置回退语言环境来解决这个问题。但是现在您可以在创建时显式传递语言环境DateEntry以避免错误:

date_frame_container['date_picker'] = DateEntry(date_frame_container['frame']), locale='en_US')
于 2019-07-22T15:55:20.450 回答