首先,请不要愤怒地使用exec()/ eval()。这是最后的手段,我没有为此提供意见。写出变量名的蛮力似乎太冗长了,我想不出更好的方法来做到这一点。
无论如何,我正在python tkinter中编写日历应用程序,并且更改月份对我来说已经成为一个问题。在日历中,每当某人更改一个月时,这些日子显然在一周中的不同日期开始(2014年5月开始于星期四,2014年6月开始于星期日)。
为了显示一个月的日子,我每天都给出一个按钮和一个自己的特殊变量名称
exec('self.daynum'+str(7*(w-2)+d)+
' = Button(text=day, width=2)')
其中w和d是周数和日数的变量。所以,当我想隐藏这些按钮时,我相信我应该使用
exec('self.daynum'+str(day)+'.grid_forget()')
其中day在0-35之间循环并清除整个网格(理论上)。但是,它引发了一个AttributeError,坚持认为这些变量不存在。
有没有办法解决这个问题并隐藏我不想要的按钮,或者有关如何重新编程程序以避免使用的建议 这些(但仍然隐藏我不想要的按钮)?
答案 0 :(得分:0)
没有好办法解决这个根本上有缺陷的方法。有一种更简单的方法,即使用字典来保存小部件:
widgets = {}
for daynum in range(31):
widgets[daynum] = Button(text=str(day), width = 2)
...
widgets[daynum].grid_forget()
这样做可以使您的代码更易于管理。
答案 1 :(得分:0)
使用列表和词组,您真的不需要使用eval / exec。 以下示例创建一个月的日历并保留按钮列表。 您可以稍后使用例如访问这些按钮dayButtons [0]。 所以要稍后隐藏一个按钮,你可以做dayButtons [day] .grid_forget()。
import Tkinter as tk
import datetime
f = tk.Frame()
dayButtons = []
for day in range(1, 32):
date = datetime.datetime(day=day, month=5, year=2014)
_, weeknum, weekday = date.isocalendar()
dayButton = tk.Button(None, text=str(day), width=2)
dayButton.grid(row=weeknum, column=weekday)
dayButtons.append(dayButton)
tk.mainloop()