Tkinter复选框问题

时间:2016-08-11 08:10:13

标签: python checkbox tkinter

编辑:更改为使用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函数。问题是

  1. 单击该项目后我不知道在何处或如何销毁它

  2. 似乎程序在进入函数PieceName时不会继续。它通过完整的功能,但它永远不会打印“我正在离开复选框功能”。我认为这可能是一个错误,因为我破坏了这个功能。任何帮助都会很精彩!

  3. 如果你很好奇,这是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")
    

1 个答案:

答案 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")

感谢您的帮助!