Найти - Пользователи
Полная версия: ttkcalendar: создание всплывающей формы с календарем
Начало » GUI » ttkcalendar: создание всплывающей формы с календарем
1
Dr.Livsi
Доброго времени суток!
Есть форма, обрабатывающая определенный период. Период задается двумя полями типа Entry. Обработка данных ведется достаточно часто, поэтому использование ввода с клавы порядком надоело. Хочу сделать ввод данных с календаря. Нашел в интернете ttkcalendar. А дальше возникли проблемы: я могу поставить 2 календаря в форму и через calendar.selection подучить выделенные даты. Но
1) не могу понять, как там задавать дату по-умолчанию (что бы при открытии календаря уже была выделена какая-то заданная дата)
2) на форме мало места и в идеале эти календари лучше вообще убрать, оставить только поля с датой но так, что бы при щелчке на поле открывался рядом календарь, который бы после щелчка по дате возвращал полученной значение обратно в поле, а сам закрывался.
Опыта, к сожалению, не хватает для реализации.
Сталкивался ли кто с подобной задачей и как её решили?
Griffon
Этот календарь что ли?
class Calendar(ttk.Frame):
# XXX ToDo: cget and configure

datetime = calendar.datetime.datetime
timedelta = calendar.datetime.timedelta

def __init__(self, master=None, **kw):
"""
WIDGET-SPECIFIC OPTIONS

locale, firstweekday, year, month, selectbackground,
selectforeground
Обращаю внимание на:
WIDGET-SPECIFIC OPTIONS

locale, firstweekday, year, month, selectbackground,
selectforeground
А следовательно надо всего лишь задать параметры month и year.

upd: чего действительно не хватает, так это колбэка на выбор даты.
Dr.Livsi
именно этот. В том то и дело, что конкретную дату выбрать нельзя - только месяц и год (по крайней мере, мне не понятно, как здесь можно это сделать, не модифицируя код) .
Griffon
Насколько я вижу, на данный момент класс не реализует таких возможностей. Но можно добавить:
    def set_day(self, day):
for row in range(2, 8):
text_row = 'I00%s' % row
for column in range(1, 8):
text_column = '#%s' % column
curr_row_values = self._calendar.item(text_row)['values']
if not curr_row_values: # empty row
continue
curr_day = curr_row_values[column-1]
if curr_day == '': # empty value for this month
continue
text = '%02d' % int(curr_day)
if day == curr_day:
if not self._calendar.bbox(text_row, text_column): # calendar not visible yet
return
self._selection = (text, text_row, text_column)
self._show_selection(text, self._calendar.bbox(text_row, text_column))
Теперь
def test():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(root, firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
ttk.Button(root, text="asdf", command=lambda:ttkcal.set_day(10)).pack()
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
import time
root.mainloop()
Лучше конечно добавить ключ в конструктор.

Хотя вообще метод выделения c помощью Canvas мне кажется перебором. Уверен, что с помощью Style().map можно установить background ячейки значением (“selected”, my_color_here)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB