python中的dictionary tkinter即使使用grid\u forget()也不隐藏grid中的按钮

2024-06-08 02:58:30 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑2:我意识到我忘了把字典顶部的变量名改成。。。我现在很生气。你知道吗

编辑:我把这些执行官都改成了字典。你知道吗

首先,请不要因为我使用exec()/eval()而生气。这是万不得已的办法,我不会为此付出代价。暴力写出变量名似乎太长了,我想不出更好的方法。你知道吗

不管怎样,我正在用pythontkinter编写一个日历应用程序,更改月份对我来说是个问题。在日历中,每当有人更改一个月时,这些天显然是从一周中不同的一天开始的(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()')

其中一天是循环超过0-35和清除整个网格(理论上)。但是,它却引发了AttributeError,坚称这些变量不存在。你知道吗

有没有办法解决这个问题,隐藏我不想要的按钮,或建议如何改造程序不使用 这些(但仍然隐藏我不想要的按钮)?你知道吗


Tags: 方法self编辑字典eval按钮exec意识
2条回答

没有好的方法来修复这个根本上有缺陷的方法。有一种更简单的方法,即使用字典来保存小部件:

widgets = {}
for daynum in range(31):
    widgets[daynum] = Button(text=str(day), width = 2)
...
widgets[daynum].grid_forget()

这样做将使代码更易于管理。你知道吗

使用列表和dict,您真的不需要使用eval/exec。 下面的示例创建一个月的日历并保留按钮列表。 您以后可以使用dayButtons[0]等工具访问这些按钮。 所以以后要隐藏按钮,可以执行dayButtons[day].grid\u 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()

相关问题 更多 >

    热门问题