【问题标题】:dictionary in python tkinter not hiding button in grid even with grid_forget()python tkinter中的字典即使使用grid_forget()也不会隐藏网格中的按钮
【发布时间】:2014-05-27 23:00:53
【问题描述】:

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

编辑:我将所有这些 exec 更改为字典。

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

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

【问题讨论】:

  • 您能否将所有Button 实例保存在一个字典中而不是使用exec?然后你会这样做:self.daynums[str(7*(w-2)+d)] = Button(text=day, width=2)self.daynums[str(day)].grid_forget()
  • 哇,这听起来确实是个好主意。让我看看……
  • 它仍然没有“忘记”所有的按钮。
  • 我对 tkinter 不够熟悉,无法帮助您完成这部分工作。我只是想提出一些建议,以帮助您避免到处使用exec

标签: python grid tkinter


【解决方案1】:

没有什么好的方法可以解决这种根本上存在缺陷的方法。有一种更简单的方法,即使用字典来保存您的小部件:

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

这样做将使您的代码更易于管理。

【讨论】:

  • 是的,我换成了字典。但是,grid_forget() 仍然无法正常工作。
  • @kevin:错误应该告诉你到底出了什么问题。假设它告诉你字面上的真相。如果它说某些东西不存在,那么它不存在。要么有错字,要么访问不同的局部变量而不是全局变量或实例变量,要么在第一次创建它之前尝试忘记它,等等。我们无法为您提供帮助,因为您没有向我们提供足够的信息。
  • 抱歉,我遇到了一个关键错误。 (在我使用 try:except 之前)我该如何解决这个问题?
  • Keyerror 男士您正在使用不存在的密钥([] 中的内容)。我不能告诉你为什么它不存在。也许你还没有创建它,也许你有错字,也许你在不同的字典中创建了它,......
【解决方案2】:

使用列表和字典,您真的不需要使用 eval/exec。 以下示例创建一个月的日历并保留按钮列表。 您可以稍后使用例如访问这些按钮。天按钮[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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多