繁体   English   中英

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

[英]Enable/Disable multiple Entry widgets using tkinter.grid()

我正在为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)

执行代码可以为我提供以下窗口,且没有错误: http : //i.imgur.com/aNItO0f.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()而不是grid来使用该方法。 通常我只是切换到.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)

扩展blackbirdkim的答案,Tkinter(与python中很多其他东西不同)对于窗口管理器之类的东西的返回值不一定很直观(.grid总是返回None而不是父小部件)。 不可避免地会有像这样的奇怪事情的雷区(菜单的add_checkbutton很快就浮现在脑海中,因为没有为您提供与checkbutton相同的基础访问权限)。 它需要(至少在Tkinter中)检查每种方法返回的确切值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM