Trong __setup_selection() có một ràng buộc về cấu hình sự kiện. Có lẽ, ở đó để xóa "canvas chọn" khi lịch được thay đổi kích thước. Tuy nhiên, sự kiện Định cấu hình cũng sẽ kích hoạt khi lịch là được ánh xạ đầu tiên lên màn hình, vì vậy ngày được chọn trước của bạn sẽ biến mất trước khi bạn xem được.
set_day (bên dưới) cho phép bạn chọn một ngày theo chương trình. Nó ngăn cản vấn đề của sự kiện Định cấu hình đầu tiên đó bằng cách lập lại lịch biểu nếu tiện ích chưa hiển thị.
thay đổi Lịch:
def __setup_selection(self, sel_bg, sel_fg):
self._font = font.Font()
self._canvas = canvas = tkinter.Canvas(self._calendar,
background=sel_bg, borderwidth=0, highlightthickness=0)
canvas.text = canvas.create_text(0, 0, fill=sel_fg, anchor='w')
canvas.bind('<ButtonPress-1>', lambda evt: canvas.place_forget())
#self._calendar.bind('<Configure>', lambda evt: canvas.place_forget())
self._calendar.bind('<Configure>', self.on_configure)
self._calendar.bind('<ButtonPress-1>', self._pressed)
def on_configure(self, event):
self._canvas.place_forget()
if self._selection is not None:
text, iid, column = self._selection
bbox = self._calendar.bbox(iid, column)
self._show_selection(text, bbox)
def _prev_month(self):
"""Updated calendar to show the previous month."""
self._canvas.place_forget()
self._selection = None #
self._date = self._date - self.timedelta(days=1)
self._date = self.datetime(self._date.year, self._date.month, 1)
self._build_calendar() # reconstuct calendar
def _next_month(self):
"""Update calendar to show the next month."""
self._canvas.place_forget()
self._selection = None #
year, month = self._date.year, self._date.month
self._date = self._date + self.timedelta(
days=calendar.monthrange(year, month)[1] + 1)
self._date = self.datetime(self._date.year, self._date.month, 1)
self._build_calendar() # reconstruct calendar
def set_day(self, day):
w = self._calendar
if not w.winfo_viewable():
w.after(200, self.set_day, day)
return
text = '%02d' % day
column = None
for iid in self._items:
rowvals = w.item(iid, 'values')
try:
column = rowvals.index(text)
except ValueError as err:
pass
else:
item = iid
bbox = w.bbox(iid, column)
break
if column is not None:
self._selection = (text, item, column)
self._show_selection(text, bbox)
#test
def test():
import sys
root = tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
ttkcal.set_day(16) #
root.mainloop()
Tôi cũng bối rối. Tôi đặt 'print ((văn bản, textw, bbox, canvas ['background'], x, y, canvas ['width'], canvas ['height'], canvas.text), '\ n', (self._calendar, canvas.coords (canvas.text), canvas.itemcget (canvas.text, 'text'))) 'ở cuối _show_selection và mọi thứ đều giống nhau. Tôi cũng đã thêm 'self._selection = ('16', 'I004', '# 2')' trước cuộc gọi được thêm vào trong '__init__', để khớp với dòng trong' _pressed'. Tôi thậm chí còn thêm 'self._canvas.place_forget(), từ tìm kiếm trong _setup_selection. –
Tôi cũng cố gắng 'self._canvas.event_generate ('', x = 50, y = 73) self._calendar.event_generate ('', x = 50, y = 73) '. Tôi đặt 'print (evt.x, evt.y, evt.widget)' ở đầu '_pressed' để xác minh rằng nó được gọi khi khởi động với cùng một sự kiện. Vẫn không làm việc. –