我正在構建一個下拉菜單,用於選擇開始日期。它有3個級聯,分別命名爲年,月,日。生成一天級聯的內容,以便可用天數與所選年份和月份一致。 在單個會話中,用戶可能/可能會多次更改日期。Tkinter菜單選擇日期
我的問題:當用戶第一次選擇年/月時,會生成days命令。此後,任何新年/月的組合,下面的代碼只是將命令添加到級聯。因此,這一天的級聯包含兩個月的日子。
我一直在努力使代碼刪除舊的菜單欄進入daymenu並重新創建它基於新的數據。 我想知道,如何對預先存在的運行菜單進行更改?我已經搜索了tkinter文檔,但不知道如何實現它。
import calendar as cal
import Tkinter as tk
import datetime
import os.path
window = tk.Tk()
# Menu variables:
year = tk.IntVar()
month = tk.IntVar()
day = tk.IntVar()
hour = tk.IntVar()
minute = tk.IntVar()
dur_hour = tk.IntVar()
dur_minute = tk.IntVar()
duration = tk.StringVar()
start = tk.StringVar()
# list initializations
list_of_years = []
list_of_months = []
list_of_hours = []
list_of_days = []
list_of_minutes = []
def year_seter(value):
year.set(value)
all_for_day()
def all_for_day(): #checks if the data needed to determine number of days in the month is present
list_of_days = []
y = year.get()
m = month.get()
lenght_of_month = cal.monthrange(y,m)
lenght_of_month2 = lenght_of_month[1]
if m != 0 and y != 0:
make_daylist(lenght_of_month2)
make_daymenu()
def month_seter(value):
month.set(value)
all_for_day()
def day_seter(value):
day.set(value)
def time_parameters():
the_date = datetime.datetime(1,1,1,0,0,0,0)
the_date = the_date.now()
end_year = the_date.year
make_yearlist(1995, end_year)
make_monthlist()
make_hourlist()
make_minutelist()
def make_yearlist(the_year, end_year):
while the_year <= end_year:
list_of_years.append(the_year)
the_year += 1
def make_monthlist():
for i in range(12):
list_of_months.append(i + 1)
def make_daylist(num_days):
for i in range(num_days):
list_of_days.append(i + 1)
def make_hourlist():
for i in range(24):
list_of_hours.append(i)
def make_minutelist():
for i in range(60):
list_of_minutes.append(i)
def make_daymenu():
for the_day in list_of_days:
daymenu.add_command(label=the_day, command=lambda : day_seter(the_day))
window.config(menu=menubar)
# The following constructs the menu
time_parameters()
menubar = tk.Menu(window)
yearmenu = tk.Menu(menubar)
for the_year in list_of_years:
yearmenu.add_command(label=str(the_year), command=lambda the_year=the_year: year_seter(the_year))
menubar.add_cascade(label = 'Year', menu=yearmenu)
window.config(menu=menubar)
monthmenu = tk.Menu(menubar)
for the_month in list_of_months:
monthmenu.add_command(label=the_month, command=lambda the_month=the_month: month_seter(the_month))
menubar.add_cascade(label = 'Month', menu=monthmenu)
window.config(menu=menubar)
daymenu = tk.Menu(menubar)
menubar.add_cascade(label = 'Day', menu=daymenu)
window.config(menu=menubar)
window.mainloop()
當然,所有的月份至少有28天,所以你需要添加或刪除更多的東西。 –
@ByanOakley:我不太清楚如何實施你的建議。這不像使用'daymenu.delete(29,31)'那麼簡單,因爲那會重複1..28天。限制for循環只添加所需的日期需要找出菜單中已有的日期。如何做到這一點? – unutbu
我也曾想過這個解決方案,但我仍然在學習基礎知識,所以我不知道如何實現它。無論如何,感謝你們兩位的投入。 – Sasha