即使从列表框

时间:2016-10-19 19:08:34

标签: python tkinter listbox

所以我的小游戏被编程为让两个角色互相争斗。一个来自左侧,一个来自右侧。在他们打架之后,无论谁赢或输,都应该删除。实际上它们已经从列表框中删除了,但是在你从两边争取两个以上的字符之后,那些以前的字符有时会显示出来。如果你从Zys和Rash开始战斗,除了他们之外,在胜负部分没有打印其他名字。只有当你从Dant和Ilora向后退时,它才会按照每个角色在胜负中只占一次的方式运作。如果你从一些其他角色开始,他们可以多次进入胜负部分。即使没有选择进行战斗,角色也可以作为输赢。底线是每个角色在对方ONCE上对抗一个角色,之后它被放置然后删除而在程序的后半部分没有用。出于某些明显的原因,它不会这样做。

from tkinter import *
from tkinter import ttk
from tkinter import messagebox

class Character: 
    def __init__(self, name, attack, defense, health):
        self.name = name
        self.attack = attack
        self.defense = defense
        self.health = health
        self.total = attack+defense+health

#Left side characters
Rash = Character("Rash", 42, 50, 80)
Untss = Character("Untss", 15, 54, 100)
Ilora = Character("Ilora", 60, 35, 80)
                                    #Both sides have totals of 165 168 and 175
#Right side characters
Zys = Character("Zys", 12, 97, 83)
Eentha = Character("Eentha", 55, 17, 90)
Dant = Character("Dant", 73, 28, 88)

def fight(): #Part of code that checks for wins and loss checks which has greater total stats and deletes from list box

    try:
        namel = ""
        namer=""
        left = lbox.curselection()[0]
        right = rbox.curselection()[0]

        totalleft = 0
        totalright = 0
        if left == 0:
            namel = "Rash"
            totalleft = Rash.total
        elif left==1:
            namel = "Untss"
            totalleft = Untss.total
        elif left==2:
            namel = "Ilora"
            totalleft = 60+35+80

        if right == 0:
            namer = "Zys"
            totalright = Zys.total
        elif right==1:
            namer = "Eentha"
            totalright = Eentha.total
        elif right==2:
            namer = "Dant"
            totalright = Dant.total

        lbox.delete(lbox.curselection()[0])
        rbox.delete(rbox.curselection()[0])
        print(namel)
        print(namer)
        if (totalleft>totalright): #Checks if won or lost
            wins.set(wins.get()+"\n"+namel)
            loss.set(loss.get()+"\n"+namer)
        else:
            wins.set(wins.get()+"\n"+namer)
            loss.set(loss.get()+"\n"+namel)
    except IndexError:
            pass


#The left listbox and its characters
leftnames = ('Rash', 'Untss', 'Ilora')
lnames = StringVar(value=leftnames)
lbox = Listbox(mainframe, listvariable=lnames, exportselection=0, height=3)
lbox.grid(column=0, row=0)


#Right listboxes characters
rightnames = ('Zys', 'Eentha', 'Dant')
rnames = StringVar(value=rightnames)
rbox = Listbox(mainframe, listvariable=rnames, exportselection=0, height=3)
rbox.grid(column=1, row=0)


#Shows users wins and lossses

wins = StringVar()
loss = StringVar()

#Label that 
ttk.Label(mainframe, text="Wins", width=13).grid(column=2, row=0, sticky=N)
ttk.Label(mainframe, text="Loss", width=13).grid(column=2, row=1, sticky=N)
ttk.Label(mainframe, textvariable=wins).grid(column=2, row=0, sticky=(S,E))
ttk.Label(mainframe, textvariable=loss).grid(column=2, row=1, sticky=(S, E))

#Button for fighting
fightbttn= ttk.Button(mainframe, text="Fight", command=fight)
fightbttn.grid(column=3, row=3, sticky=(E))

root.mainloop()

这只是代码中可能与问题有关的部分,而不是整个代码。

这与昨天相同的代码不是同一个问题。我认为一次使用一个错误作为不同的问题更合适,这样他们就可以更有条理。

1 个答案:

答案 0 :(得分:0)

问题是因为您始终使用if left == 0: namel = "Rash" even if“Rash”was deleted from listbox and now left == 0 means“Untss”。

您必须获取所选名称而不是索引

    namel = lbox.get(lbox.curselection()[0])
    namer = rbox.get(rbox.curselection()[0])

并使用它

    if namel == "Rush":
       totalleft = Rash.total

但你可以使用字典来获取数据

left_characters = {        
    "Rash": Character("Rash", 42, 50, 80),
    "Untss": Character("Untss", 15, 54, 100),
    "Ilora": Character("Ilora", 60, 35, 80),
}

right_characters = {
    "Zys": Character("Zys", 12, 97, 83),
    "Eentha": Character("Eentha", 55, 17, 90),
    "Dant": Character("Dant", 73, 28, 88),
}

leftnames = list(left_characters.keys())
rightnames = list(right_characters.keys())

然后

def fight():

    try:
        namel = lbox.get(lbox.curselection()[0])
        namer = rbox.get(rbox.curselection()[0])

        print(namel)
        print(namer)

        totalleft = left_characters[namel].total
        totalright = right_characters[namer].total

        lbox.delete(lbox.curselection()[0])
        rbox.delete(rbox.curselection()[0])

        if totalleft > totalright : #Checks if won or lost
            wins.set(wins.get()+"\n"+namel)
            loss.set(loss.get()+"\n"+namer)
        else:
            wins.set(wins.get()+"\n"+namer)
            loss.set(loss.get()+"\n"+namel)
    except IndexError as e:
        print("ERROR:", e)

如果您向字典中添加新字符,则无需更改代码。

BTW:请勿在{{1​​}}中使用pass,因为如果代码出现问题,您就不会看到错误。