2016-05-11 19 views
6

Tôi đang sử dụng this ttk calendar trong đơn đăng ký của mình.Cách đặt lịch ttk theo chương trình

Điều tôi muốn làm là đặt lịch bằng cách sử dụng ví dụ datetime.date để khi lịch xuất hiện ngày được chỉ định được tô sáng.

Tôi nghĩ rằng tôi có thể đi qua phương pháp _show_selection với hướng dẫn sử dụng textbbox args. Để kiểm tra ý tưởng này, tôi đặt dòng này vào cuối của phương pháp __init__:

self._show_selection('%02d'%16,(42,61,41,20))

Tôi đã hy vọng nó sẽ làm nổi bật ngày 16 của tháng này (tháng), nhưng nó thì không.

Tôi đã nhận được số tiền từ chạy print text, bbox trong phương thức _pressed.

Nếu ai cũng có thể làm sáng tỏ điều này, tôi rất cảm kích điều đó.

+1

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. –

+1

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. –

Trả lời

0

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() 
0

Đối với phần @Oblivion nhất là đúng, tuy nhiên tôi muốn để có thể sử dụng một đối tượng Datetime.date và để có thể đi qua những tháng và những năm nếu cần thiết. Khi tôi đã thay đổi phương thức set_day bên dưới, mọi thứ hoạt động hoàn hảo.

def set_day(self, dt_object): 
    day = dt_object.day 
    w = self._calendar 

    if not w.winfo_viewable(): 
     w.after(200, self.set_day, dt_object) 
     return 
    while dt_object.year < self._date.year: 
     self._prev_month() 
    while dt_object.year > self._date.year: 
     self._next_month() 
    while dt_object.month < self._date.month: 
     self._prev_month() 
    while dt_object.month > self._date.month: 
     self._next_month() 
    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) 
    else: 
     print "Column is None" 
Các vấn đề liên quan