编辑:更改为使用TopLevel和单选按钮
我正在制作一个python国际象棋游戏以获得它的乐趣,我在创建一个复选框时遇到了一些问题。
在国际象棋的标准游戏中,如果棋子到达棋盘的另一侧,玩家将能够选择他们想要的棋子。
好吧,我想给用户一个复选框以检查他们想要的项目,然后该框将消失(销毁)。这是我的代码:
from Tkinter import *
def AddChessPiece():
CheckBox = TopLevel()
print("Im in The checkbox function")
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
CheckVar4 = IntVar()
C1 = Radiobutton(CheckBox, text="Rook",variable = CheckVar1, command = lambda: PieceName("Rook"))
C2 = Radiobutton(CheckBox, text="Knight",variable = CheckVar2,command= lambda: PieceName("Knight"))
C3 = Radiobutton(CheckBox, text="Bishop",variable = CheckVar3,command= lambda: PieceName("Bishop"))
C4 = Radiobutton(CheckBox, text="Queen",variable = CheckVar4, command= lambda: PieceName("Queen"))
C1.pack()
C2.pack()
C3.pack()
C4.pack()
CheckBox.mainloop()
print("Im leaving the checkbox function")
它正在做的是创建窗口,然后在选中时,它将项目发送到lambda函数。问题是
单击该项目后我不知道在何处或如何销毁它
似乎程序在进入函数PieceName时不会继续。它通过完整的功能,但它永远不会打印“我正在离开复选框功能”。我认为这可能是一个错误,因为我破坏了这个功能。任何帮助都会很精彩!
如果你很好奇,这是PieceName方法。我认为它不会有任何帮助。它的作用是首先将新坐标添加到新的棋子中(取决于它的玩家1(白棋子)或玩家2(黑棋子)转向)然后移除棋子坐标。
def PieceName(name):
global Player1, CurrentChessPiece, IndexVal,White_Pieces,Black_Pieces
if(Player1 == True):
FullName = "White_" + name
NewPieceIndex = White_Pieces.index(FullName)
White_Pieces[NewPieceIndex].coordinates.append(CurrentChessPiece.coordinates[IndexVal])
else:
FullName = "Black_" + name
NewPieceIndex = Black_Pieces.index(FullName)
Black_Pieces[NewPieceIndex].coordinates.append(CurrentChessPiece.coordinates[IndexVal])
del CurrentChessPiece.coordinates[IndexVal]
CheckBox.destroy()
print("Im leaving the PieceName function")
答案 0 :(得分:1)
好的,这是现在正在运行的新版本。我所做的是删除所有lambda参数,并将所有可能的值保存到" CheckVar1"。从那里我创建了一个消息框,并为用户提供了从选项中进行选择的选项,然后单击C5("确定按钮")退出。
当点击确定按钮时,它关闭了小部件但没有销毁它,所以我仍然可以抓住" CheckVar1"。从那里,我调用了一个getter函数" CheckVar1.get()"将值作为字符串变量返回并将其传递给以下方法" PieceName"
一旦方法" PieceName"完了," Checkbox"然后被摧毁,将其从系统中移除。
def AddChessPiece():
CheckBox = Toplevel()
print("Im in The checkbox function")
CheckVar1 = StringVar()
C = Message(CheckBox,text="What did you want to\n replace your pawn for?\n\n",width = 300)
C1 = Radiobutton(CheckBox, text="Rook",variable = CheckVar1,value ="Rook")
C2 = Radiobutton(CheckBox, text="Knight",variable = CheckVar1,value = "Knight")
C3 = Radiobutton(CheckBox, text="Bishop",variable = CheckVar1,value = "Bishop")
C4 = Radiobutton(CheckBox, text="Queen",variable = CheckVar1,value = "Queen")
C5 = Button(CheckBox, text="Ok", command=CheckBox.quit)
C.pack()
C1.pack()
C2.pack()
C3.pack()
C4.pack()
C5.pack()
CheckBox.mainloop()
PieceName(str(CheckVar1.get()))
print("Im leaving the checkbox function")
CheckBox.destroy()
这是第二个功能。唯一改变的是" CheckBox.destroy()"在这个功能中完全没有使用过。 CheckBox在这个函数中根本没用过,所以这段代码现在与讨论无关。
def PieceName(name):
global Player1, CurrentChessPiece, IndexVal,White_Pieces,Black_Pieces
if(Player1 == True):
FullName = "White_" + str(name)
for n in range(0, len(White_Pieces)):
if((FullName in White_Pieces[n].name)== True):
White_Pieces[n].coordinates.append(CurrentChessPiece.coordinates[IndexVal])
else:
FullName = "Black_" + str(name)
for n in range(0,len(Black_Pieces)):
if((FullName in Black_Pieces[n].name) == True):
Black_Pieces[n].coordinates.append(CurrentChessPiece.coordinates[IndexVal])
del CurrentChessPiece.coordinates[IndexVal]
print("Name is " + str(FullName))
print("Im leaving the PieceName function")
感谢您的帮助!