我正在寻找一种在 tkinter 窗口内显示日历或其他日期选择器的方法。我知道 tkcalendar 并且它效果很好。但是,我正在寻找一种无需 tkcalendar 即可实现此目的的方法,因为 tkcalendar 是根据 GPLv3 获得许可的。我搜索了互联网,发现所有论坛都一致表示,包含“import tkcalendar”字样的代码,即使未编译,也被视为派生作品,因此也必须根据 GPLv3 获得许可。这些威胁都没有得到法律专家的答复,但我不想冒险进口任何根据 GLP 许可的东西。
有人可以建议 tkcalendar 的替代方案,或者建议如何在不从源代码复制的情况下重新创建它吗?
编辑:我被要求添加一个解释,说明我的 GPL 问题是什么。我的问题是,据我了解,导入 tkcalendar 的代码被视为 tkcalendar 的“派生作品”,因此也需要根据 GPL 获得许可。不过,我不想在 GPL 下许可我的程序,因此据我了解,我无法导入任何 GPL 许可的模块。
您可以使用calendar.monthcalendar的输出轻松创建日历。只需迭代数据,为每一天创建按钮即可。
这是一个基本的例子。这不是完整的解决方案,但它确实展示了如何创建小部件并打印出用户单击的日期。
import tkinter as tk
import calendar
class CalendarWidget(tk.Frame):
def __init__(self, parent, year, month, **kwargs):
super().__init__(parent, **kwargs)
self.cal_frame = tk.Frame(self)
self.cal_frame.pack(side="top", fill="x")
self.redraw(year, month)
def redraw(self, year, month):
'''Redraws the calendar for the given year and month'''
for child in self.cal_frame.winfo_children():
child.destroy()
# day of the week headings
for col, day in enumerate(("Mo", "Tu", "We", "Th", "Fr", "Sa", "Su")):
label = tk.Label(self.cal_frame, text=day)
label.grid(row=0, column=col, sticky="nsew")
# buttons for each day
cal = calendar.monthcalendar(year, month)
for row, week in enumerate(cal):
for col, day in enumerate(week):
text = "" if day == 0 else day
state = "normal" if day > 0 else "disabled"
cell = tk.Button(self.cal_frame, text=text, state=state, command=lambda day=day: self.set_day(day))
cell.grid(row=row+1, column=col, sticky="nsew")
def set_day(self, num):
print(f"you selected day {num}")
root = tk.Tk()
c = CalendarWidget(root, year=2022, month=4, bd=2, relief="groove")
c.pack(padx=4, pady=4)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1559 次 |
最近记录: |