Python 如何在tkcalendar中获取单元格的背景?

Python 如何在tkcalendar中获取单元格的背景?,python,tkinter,tkcalendar,Python,Tkinter,Tkcalendar,我有这个日历,我想得到所选单元格的背景色,我怎么做 Current_Date = str(datetime.today()) Current_Date=Current_Date[0:10].split('-') cal = Calendar(root, selectmode="day", year=int(Current_Date[0]), month=int(Current_Date[1]), day=int(Current_Date[2])

我有这个日历,我想得到所选单元格的背景色,我怎么做

Current_Date = str(datetime.today())
Current_Date=Current_Date[0:10].split('-')
cal = Calendar(root, selectmode="day", year=int(Current_Date[0]), 
               month=int(Current_Date[1]), day=int(Current_Date[2]))
cal.pack(pady=20)

坦白地说,我不知道为什么你需要访问手机,为什么你需要知道手机的背景。如果您想更改单元格中的颜色,则应该使用标记`

顺便说一句:您不必将日期转换为字符串并拆分它

current_date = datetime.datetime.today()

cal = tkcalendar.Calendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)

tkcalendar
不提供对单元格的直接访问。但是有一个隐藏的
cal.\u calendar
,它保存了用于创建单元格的所有标签,通过这种方式,您可以尝试访问所需的标签。但标签不直接使用背景,而是使用样式,您必须将样式转换为底色


此代码显示当月所有单元格的样式

import datetime
import tkinter as tk
import tkcalendar

# --- functions

def on_click():
    #print(cal._calendar)

    # display all `labels` 
    for row in cal._calendar:
        for day in row:
            number = day['text']
            style = day['style']
            background = cal.style.configure(day['style'])['background']
            print('day: {:2} | style: {:27} | background: {}'.format(number, style, background))
            
# --- main ---

root = tk.Tk()

current_date = datetime.datetime.today()  # PEP8: lower_case_namas

cal = tkcalendar.Calendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)
cal.pack(pady=20, padx=20)
               
button = tk.Button(root, text='Show all styles', command=on_click)
button.pack(pady=(0,20), padx=20)

print(cal.style)
root.mainloop()
结果:

day: 30 | style: normal_om..!calendar.TLabel | background: gray93
day: 1  | style: normal..!calendar.TLabel    | background: white
day: 2  | style: normal..!calendar.TLabel    | background: white
day: 3  | style: normal..!calendar.TLabel    | background: white
day: 4  | style: normal..!calendar.TLabel    | background: white
day: 5  | style: we..!calendar.TLabel        | background: gray80
day: 6  | style: we..!calendar.TLabel        | background: gray80
day: 7  | style: normal..!calendar.TLabel    | background: white
day: 8  | style: normal..!calendar.TLabel    | background: white
day: 9  | style: normal..!calendar.TLabel    | background: white
day: 10 | style: normal..!calendar.TLabel    | background: white
[...]

如果要在单击单元格时访问,则可能必须创建自己的类并在单击时覆盖方法

import datetime
import tkinter as tk
import tkcalendar

# --- functions

class MyCalendar(tkcalendar.Calendar):
    def _on_click(self, event):
        print('LABEL:', event.widget)
        print('LABEL text :', event.widget['text'])
        print('LABEL style:', event.widget['style'])
        background = cal.style.configure(event.widget['style'])['background']
        print('LABEL background:', background)
        print('---')
        
        # run original `_on_click`
        super()._on_click(event)

   
# --- main ---

root = tk.Tk()

current_date = datetime.datetime.today()  # PEP8: lower_case_namas

cal = MyCalendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)
cal.pack(pady=20, padx=20)
cal.bind('<<CalendarSelected>>', on_select)

root.mainloop()

坦白地说,我不知道为什么你需要访问手机,为什么你需要知道手机的背景。如果您想更改单元格中的颜色,则应该使用标记`

顺便说一句:您不必将日期转换为字符串并拆分它

current_date = datetime.datetime.today()

cal = tkcalendar.Calendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)

tkcalendar
不提供对单元格的直接访问。但是有一个隐藏的
cal.\u calendar
,它保存了用于创建单元格的所有标签,通过这种方式,您可以尝试访问所需的标签。但标签不直接使用背景,而是使用样式,您必须将样式转换为底色


此代码显示当月所有单元格的样式

import datetime
import tkinter as tk
import tkcalendar

# --- functions

def on_click():
    #print(cal._calendar)

    # display all `labels` 
    for row in cal._calendar:
        for day in row:
            number = day['text']
            style = day['style']
            background = cal.style.configure(day['style'])['background']
            print('day: {:2} | style: {:27} | background: {}'.format(number, style, background))
            
# --- main ---

root = tk.Tk()

current_date = datetime.datetime.today()  # PEP8: lower_case_namas

cal = tkcalendar.Calendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)
cal.pack(pady=20, padx=20)
               
button = tk.Button(root, text='Show all styles', command=on_click)
button.pack(pady=(0,20), padx=20)

print(cal.style)
root.mainloop()
结果:

day: 30 | style: normal_om..!calendar.TLabel | background: gray93
day: 1  | style: normal..!calendar.TLabel    | background: white
day: 2  | style: normal..!calendar.TLabel    | background: white
day: 3  | style: normal..!calendar.TLabel    | background: white
day: 4  | style: normal..!calendar.TLabel    | background: white
day: 5  | style: we..!calendar.TLabel        | background: gray80
day: 6  | style: we..!calendar.TLabel        | background: gray80
day: 7  | style: normal..!calendar.TLabel    | background: white
day: 8  | style: normal..!calendar.TLabel    | background: white
day: 9  | style: normal..!calendar.TLabel    | background: white
day: 10 | style: normal..!calendar.TLabel    | background: white
[...]

如果要在单击单元格时访问,则可能必须创建自己的类并在单击时覆盖方法

import datetime
import tkinter as tk
import tkcalendar

# --- functions

class MyCalendar(tkcalendar.Calendar):
    def _on_click(self, event):
        print('LABEL:', event.widget)
        print('LABEL text :', event.widget['text'])
        print('LABEL style:', event.widget['style'])
        background = cal.style.configure(event.widget['style'])['background']
        print('LABEL background:', background)
        print('---')
        
        # run original `_on_click`
        super()._on_click(event)

   
# --- main ---

root = tk.Tk()

current_date = datetime.datetime.today()  # PEP8: lower_case_namas

cal = MyCalendar(root, selectmode="day",
                   year=current_date.year, 
                   month=current_date.month,
                   day=current_date.day)
cal.pack(pady=20, padx=20)
cal.bind('<<CalendarSelected>>', on_select)

root.mainloop()

根据,每次用户用鼠标选择一天时,都会生成一个虚拟的
事件。这意味着您可以编写一个事件处理程序函数来更改所选单元格的背景颜色,然后将此函数更改为事件。您可以使用
cal.cget(“selectbackground”)
。您不必将
datetime.toda()
转换为字符串,而只需获取
当前日期.year
当前日期.month
Current_Date.day
您为什么需要它?我检查了,没有看到直接访问单元格的方法,但有一个隐藏的
cal.\u calendar
保存所有单元格(成行)。但是,如果您想更改bacground,则应该使用指定颜色的
标记。根据,每次用户用鼠标选择一天时,都会生成一个虚拟的
事件。这意味着您可以编写一个事件处理程序函数来更改所选单元格的背景颜色,然后将此函数更改为事件。您可以使用
cal.cget(“selectbackground”)
。您不必将
datetime.toda()
转换为字符串,而只需获取
当前日期.year
当前日期.month
Current_Date.day
您为什么需要它?我检查了,没有看到直接访问单元格的方法,但有一个隐藏的
cal.\u calendar
保存所有单元格(成行)。但是如果你想改变背景,你应该使用指定颜色的标签。