python中的字典tkinter即使使用grid_forget()也不会隐藏网格中的按钮

时间:2014-05-27 23:00:53

标签: python grid tkinter

编辑2:我意识到我忘记将字符顶部的变量名称更改为字典...我现在非常生气。

编辑:我将所有这些执行官改为字典。

首先,请不要愤怒地使用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,坚持认为这些变量不存在。

有没有办法解决这个问题并隐藏我不想要的按钮,或者有关如何重新编程程序以避免使用的建议 这些(但仍然隐藏我不想要的按钮)?

2 个答案:

答案 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()