Календарь Python Tkinter ttk

Я пытаюсь создать раскрывающийся календарь для записи даты. Ниже приведена часть моего кода:

Выпадающая часть не работает, и я не могу нигде найти синтаксис для DateEntry() календаря ttk, чтобы включить опцию виджета календаря!

#creating the frame 
from tkinter import *
from tkcalendar import *

root = Tk()

f1=Frame(root,width=1500,height=100,relief=SUNKEN,bd=4,bg='light steel blue')
f1.pack(side=TOP)
f2=Frame(root,width=1500,height=550,relief=SUNKEN,bd=4,bg='white')
f2.pack()
f3=Frame(root,width=1600,height=100,relief=SUNKEN,bd=4,bg='white')
f3.pack(side=BOTTOM)


#Creating the date column
l4=Label(f2,text='DATE',font=('tahoma',20,'bold'),fg='black',anchor='w')
l4.grid(row=0,column=3)

cal=DateEntry(f2,dateformat=3,width=12, background='darkblue',
                    foreground='white', borderwidth=4,Calendar =2018)
cal.grid(row=1,column=3,sticky='nsew')

Я хочу, чтобы это выглядело так: скриншот


person user9093127    schedule 17.01.2018    source источник
comment
Есть проблема с предоставленным вами кодом, вы используете rootf1=.. перед его определением)   -  person j_4321    schedule 17.01.2018
comment
Кроме того, я не понимаю, чего именно вы хотите добиться. Вы говорите о github.com/j4321/tkcalendar?   -  person j_4321    schedule 17.01.2018
comment
@ j_4321 приносит извинения за ручную ошибку. Моя проблема в том, что я пытаюсь создать раскрывающийся список календаря, в котором, как только пользователь щелкает его, появляется небольшой раскрывающийся список календаря, и он может выбрать дату; Затем выбранная дата появляется в пространстве. Моя проблема связана с этой строкой кода cal=DateEntry(f2,dateformat=3,width=12, background='darkblue', foreground='white', borderwidth=4,Calendar=2018 )   -  person user9093127    schedule 17.01.2018
comment
относительно синтаксиса проверьте pypi.python.org/pypi/tkcalendar#Documentation   -  person R4PH43L    schedule 17.01.2018
comment
DateEntry не имеет ключевого слова Calendar, просто передайте ключевые слова календаря напрямую.   -  person j_4321    schedule 17.01.2018
comment
@ j_4321yes я просмотрел страницу, не знаю, как мне это сделать, просто передайте ключевые слова календаря напрямую   -  person user9093127    schedule 17.01.2018
comment
Можете ли вы сказать мне, какую именно опцию вы хотите передать виджету?   -  person j_4321    schedule 17.01.2018
comment
я хочу, чтобы это выглядело так: cdn.ablebits. com/_img-blog/excel-calendar/ @j_4321 мой комментарий просто выбирает текущую дату, но я не могу заставить календарь отображаться под ним   -  person user9093127    schedule 17.01.2018
comment
напрямую означает, что вы можете использовать те же ключевые слова, что и в календаре, т.е. Calendar( ..., year=2018) и DateEntry( ... year=2018)   -  person furas    schedule 17.01.2018
comment
Я не понимаю, где проблема. За исключением строки, отображающей сегодняшнюю дату, DateEntry дает результат, очень похожий на тот, что на картинке, календарь появляется, когда пользователь нажимает кнопку со стрелкой.   -  person j_4321    schedule 17.01.2018
comment
@ j_4321 j_4321 именно здесь проблема в том, что стрелка не кликабельна   -  person user9093127    schedule 18.01.2018
comment
@furas да, пробует это как cal5=DateEntry(f2,dateformat=3,width=12, background='darkblue', foreground='white', borderwidth=4) ; проблема в том, что раскрывающийся список не действует   -  person user9093127    schedule 18.01.2018


Ответы (1)


ОБНОВЛЕНИЕ: я исправил проблему и опубликовал новую версию tkcalendar. .

EDIT: проблема в том, что в Windows раскрывающийся список не открывается при нажатии кнопки со стрелкой вниз. Кажется, это исходит из темы ttk по умолчанию для Windows, потому что она работает с другими темами. Таким образом, обходной путь состоит в том, чтобы переключить тему и использовать, например, «моллюск» («alt» также должен работать). Тем временем я посмотрю на это и посмотрю, смогу ли я исправить DateEntry для других тем и выпустить новую версию (https://github.com/j4321/tkcalendar/issues/3).

Я не уверен, чего именно вы хотите добиться с помощью DateEntry, но если ваша цель состоит в том, чтобы сделать его похожим на тот, что на картинке, это можно сделать следующим образом:

import tkinter as tk
from tkinter import ttk
from tkcalendar import DateEntry
from datetime import date

root = tk.Tk()
# change ttk theme to 'clam' to fix issue with downarrow button
style = ttk.Style(root)
style.theme_use('clam')

class MyDateEntry(DateEntry):
    def __init__(self, master=None, **kw):
        DateEntry.__init__(self, master=None, **kw)
        # add black border around drop-down calendar
        self._top_cal.configure(bg='black', bd=1)
        # add label displaying today's date below
        tk.Label(self._top_cal, bg='gray90', anchor='w',
                 text='Today: %s' % date.today().strftime('%x')).pack(fill='x')

# create the entry and configure the calendar colors
de = MyDateEntry(root, year=2016, month=9, day=6,
                 selectbackground='gray80',
                 selectforeground='black',
                 normalbackground='white',
                 normalforeground='black',
                 background='gray90',
                 foreground='black',
                 bordercolor='gray90',
                 othermonthforeground='gray50',
                 othermonthbackground='white',
                 othermonthweforeground='gray50',
                 othermonthwebackground='white',
                 weekendbackground='white',
                 weekendforeground='black',
                 headersbackground='white',
                 headersforeground='gray70')
de.pack()
root.mainloop()

Я создал класс, унаследованный от DateEntry, чтобы добавить метку с сегодняшней датой под календарем и создать черную рамку вокруг раскрывающегося списка (self._top_cal — это Toplevel, содержащий календарь).

Затем я создал экземпляр MyDateEntry со всеми параметрами календаря, необходимыми, чтобы он выглядел как на картинке. Кроме того, я использовал параметры year, month, day для определения начальной даты внутри записи. Вот результат:

screenshot

person j_4321    schedule 17.01.2018
comment
Итак, я скомпилировал код, и все, что я получаю, - это поле ввода даты с выпадающим списком unactionable. Я что-то пропустил здесь? есть ли ошибка в python 3.4.0 ?? не знаю в чем проблема :( - person user9093127; 18.01.2018
comment
@user9093127 user9093127 Я использую python 3.6 и tcl/tk 8.6, так что это может быть проблемой совместимости. Я использую appveyor и travis-ci для проверки совместимости со старым python (включая python 3.4), но я не помню, написал ли я тест для кнопки. Какую ОС вы используете и с какой версией тк? - person j_4321; 18.01.2018
comment
m с использованием python 3.4.0 и tk8.6; ОС Windows - person user9093127; 18.01.2018
comment
Я протестировал DateEntry с Python 3.3.7 и 3.4.7 в Linux, и он работает. У меня сейчас нет доступных окон, но я сделаю несколько тестов, когда смогу. - person j_4321; 18.01.2018
comment
@ user9093127 Я думаю, что определил проблему, это тема ttk по умолчанию для Windows, которая менее гибкая, чем другие, и, похоже, не обрабатывает кнопку со стрелкой вниз правильно. Так что на данный момент решение состоит в том, чтобы изменить тему (я обновил ответ), и я посмотрю, смогу ли я решить проблему с темой Windows. - person j_4321; 18.01.2018
comment
@user9093127 user9093127 Я исправил проблему в WIndows и опубликовал новую версию. - person j_4321; 25.01.2018
comment
@ j_4321 j_4321: tkcalendar, DateEntry у меня не работает. При попытке установить его с помощью pip install tkcalendar выдает ошибку (для tkcalendar не найдено подходящего дистрибутива) - person Garima Tiwari; 21.05.2018
comment
@GarimaTiwari, какую версию ОС и Python вы используете? - person j_4321; 22.05.2018
comment
@j_4321 j_4321: я использую Python 3.6.1 в Windows7. - person Garima Tiwari; 22.05.2018
comment
@GarimaTiwari У меня нет доступа к Windows, чтобы проверить это прямо сейчас, но pip работает для меня с python3.6 в Linux. Пожалуйста, откройте отчет об ошибке на github.com/j4321/tkcalendar/issues, и я посмотрю что я могу сделать. - person j_4321; 22.05.2018
comment
@ j_4321: наконец-то я смог установить tkcalendar! казалось, что есть некоторые ограничения в отношении пакетов, которые мы могли загружать ранее. - person Garima Tiwari; 31.05.2018
comment
@ j_4321 j_4321: Однако у меня есть еще один вопрос в отношении DateEntry, пожалуйста, не могли бы вы взглянуть на это, пожалуйста? Большое спасибо stackoverflow.com/questions/50625818/ - person Garima Tiwari; 31.05.2018