python - 使用 tkinter.grid() 启用/禁用多个 Entry 小部件

标签 python tkinter

我正在为 python 扫雷游戏编写一个菜单,该游戏将允许玩家输入自定义行、列和地雷计数。我希望单击简单、中等或困难单选按钮将禁用所有三个条目小部件,而单击自定义单选按钮将启用所有三个。

我的代码:

from tkinter import *

def customDisable():
    E_row.configure(state='disabled')
    E_row.update()
    E_col.configure(state='disabled')
    E_col.update()
    E_mine.configure(state='disabled')
    E_mine.update()

def customEnable():
    E_row.configure(state='normal')
    E_row.update()
    E_col.configure(state='normal')
    E_col.update()
    E_mine.configure(state='normal')
    E_mine.update()

menu=Tk()
menu.title('Pysweeper V 1.0')
ms=Canvas(menu,width=5,height=5)
ms.data={}
menu.resizable(0,0)

T_row=Label(menu,text='Rows:',anchor=E).grid(row=1,column=2)
T_col=Label(menu,text='Columns:',anchor=E).grid(row=2,column=2)
T_mine=Label(menu,text='Mines:',anchor=E).grid(row=3,column=2)

E_row=Entry(menu,state='normal').grid(row=1,column=3)
E_col=Entry(menu,state='normal').grid(row=2,column=3)
E_mine=Entry(menu,state='normal').grid(row=3,column=3)

dif=IntVar()
RB_easy=Radiobutton(menu, text='Easy',anchor=W,variable=dif,value=1,command=customDisable).grid(row=1,column=1,rowspan=2)
RB_med=Radiobutton(menu, text='Medium',anchor=W,variable=dif,value=2,command=customDisable).grid(row=3,column=1,rowspan=2)
RB_hard=Radiobutton(menu, text='Hard',anchor=W,variable=dif,value=3,command=customDisable).grid(row=5,column=1,rowspan=2)
RB_cust=Radiobutton(menu, text='Custom game',variable=dif,value=4,command=customEnable).grid(row=7,column=1)

执行代码会显示以下窗口,没有错误:https://i.sstatic.net/08N8W.png

但是,当我选择单选按钮时,控制台会打印错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
    return self.func(*args)
  File "C:\Python33\Minesweeper.py", line 212, in customDisable
    E_row.configure(state='disabled')
NameError: global name 'E_row' is not defined

看来这个错误是由于没有传入 E_row 值引起的,但我已经得到了使用 .pack() 而不是网格来工作的方法。通常我会切换到 .pack();然而,由于我的游戏的其余部分是 .grid() 而不是 .pack(),我也只能使用 .grid 作为菜单。我在这里缺少什么?

最佳答案

这个比你想象的要简单得多!事实上,您根本不必对代码进行太多更改。问题是您将 T_row、T_col 等分配给每个小部件的 grid(row=1,column=2) 方法的返回值(None)。相反,只需将语句分成两行:

T_row=Label(menu,text='Rows:',anchor=E)
T_row.grid(row=1,column=2)
T_col=Label(menu,text='Columns:',anchor=E)
T_col.grid(row=2,column=2)
T_mine=Label(menu,text='Mines:',anchor=E)
T_mine.grid(row=3,column=2)

E_row=Entry(menu,state='normal')
E_row.grid(row=1,column=3)
E_col=Entry(menu,state='normal')
E_col.grid(row=2,column=3)
E_mine=Entry(menu,state='normal')
E_mine.grid(row=3,column=3)

关于python - 使用 tkinter.grid() 启用/禁用多个 Entry 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366198/

相关文章:

python - 由于不在 TTY 中工作,无法在 Django 中创建 super 用户

python - 如何在 Tkinter/TTK 中稍微移动标签中的文本?

python - 我可以在自定义 Tkinter Toplevel() 窗口上获取消息框的图标 ="warning"噪音吗?

python - 如何从python将文件名存储在数组中

python - 使用 Tkinter 在 Pygame 中画一个圆

python - Tkinter 数学测验

python - tkinter:将多个按钮 lambda 映射到一个标签?

python - mpmath 矩阵求逆的替代方案或加速

python - 为什么 Bokeh 不在这里生成额外的 y 范围?

python - pygtk 如何在我的 pygtk GUI 中嵌入外部应用程序