Python 错误:如何阻止敌人';要重置的健康栏?

Python 错误:如何阻止敌人';要重置的健康栏?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我目前正在使用python和tkinter开发一款类似RPG的游戏。 问题是,在按下治疗按钮,然后按下任何攻击按钮后,敌人的健康栏将重置 我已经试着从哪里来理解这个错误,但是没有结果。我在每行后面都使用print()来验证这些值,但这些都不能回答我的问题 import tkinter as tk from tkinter import font import time import threading import random class InGameWindow(object) :

我目前正在使用python和tkinter开发一款类似RPG的游戏。 问题是,在按下治疗按钮,然后按下任何攻击按钮后,敌人的健康栏将重置

我已经试着从哪里来理解这个错误,但是没有结果。我在每行后面都使用print()来验证这些值,但这些都不能回答我的问题

import tkinter as tk 
from tkinter import font
import time 
import threading
import random

class InGameWindow(object) :
    def __init__(self, master) :
        #Window and it's settings
        self.master = master

        windowWidth = self.master.winfo_screenwidth()
        windowHeight = self.master.winfo_screenheight()

        rootCoord = f"800x400+{int((windowWidth/2)-400)}+{int((windowHeight/2)-200)}"

        master.title("A Simple RPG")
        master.geometry(rootCoord)
        master.resizable(width=False, height=False)
        master.overrideredirect(False)
        master.configure(bg="black")

        #Import files as .png etc...    
        levelIcon = tk.PhotoImage(file="playerInfoIcon.png")
        fireballIcon = tk.PhotoImage(file="fireball.png")
        earthquackeIcon = tk.PhotoImage(file="earthquacke.png")
        strokeIcon = tk.PhotoImage(file="stroke.png")
        healIcon = tk.PhotoImage(file="heal.png")
        startIcon = tk.PhotoImage(file="start.png")

        self.levelIcon = levelIcon
        self.fireballIcon = fireballIcon
        self.earthquackeIcon = earthquackeIcon
        self.strokeIcon = strokeIcon
        self.healIcon = healIcon
        self.startIcon = startIcon

        #Frames to create fancy borders and titles
        mainWindowFrame = tk.Frame(master, width=780, height=380, bg="black")
        mainWindowFrame.place(x=10, y=10)

        attackButtonsFrame = tk.LabelFrame(mainWindowFrame, width=420, height=165, bg="black", relief="ridge", bd=3)
        attackButtonsFrame.place(x=300, y=210)

        playerInfoFrame = tk.LabelFrame(mainWindowFrame, width=240, height=365, bg="black", bd=3)
        playerInfoFrame.place(x=10, y=10)

        self.mainWindowFrame = mainWindowFrame

        #Canvas and stuff related to player's info
        playerInfo = tk.Canvas(playerInfoFrame, bg="black", width=225, height=340, bd=0, highlightthickness=0, relief='ridge')
        playerInfo.place(x=0, y=0)

        self.playerInfo = playerInfo

        #Coordinates for .create_figure/image 
        dynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34]
        dynamicManaBarCoord = [13, 16+30, 214-100, 16+30, 195-100, 34+30, 13, 34+30]

        self.dynamicHealthBarCoord, self.dynamicManaBarCoord = dynamicHealthBarCoord, dynamicManaBarCoord


        healthBarForground = playerInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
        dynamicHealthBar = playerInfo.create_polygon(dynamicHealthBarCoord, fill="red", width=1)
        healthBarBackground = playerInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)

        manaBarForground = playerInfo.create_polygon(14, 15+30, 214-100, 16+30, 196-100, 34+30, 14, 34+30, fill="black", outline="black", width=2)
        dynamicManaBar = playerInfo.create_polygon(dynamicManaBarCoord, fill="blue", width=1)
        manaBarBackground = playerInfo.create_polygon(11, 13+30, 220-99, 13+30, 196-99, 37+30, 11, 37+30, fill="", outline="gray", width=2)

        self.dynamicHealthBar, self.dynamicManaBar = dynamicHealthBar, dynamicManaBar

        #Buttons
        Attack_Stroke = tk.Button(mainWindowFrame, image=self.strokeIcon, command=lambda: self.Stroke(dynamicHealthBarCoord), cursor="hand1", state="disabled")
        Attack_Stroke.place(x=346.67-10, y=242-15)

        Spell_Heal = tk.Button(mainWindowFrame, image=self.healIcon, command=lambda: self.Heal(dynamicHealthBarCoord), cursor="hand1", state="disabled")
        Spell_Heal.place(x=533.33+10, y=242-15)

        Attack_Fireball = tk.Button(mainWindowFrame, image=self.fireballIcon, command=lambda: self.FireBall(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
        Attack_Fireball.place(x=346.67-10, y=242+60)

        Attack_Earthquake = tk.Button(mainWindowFrame, image=self.earthquackeIcon, command=lambda: self.EarthQuacke(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
        Attack_Earthquake.place(x=533.33+10, y=242+60)

        Enter_The_Dunjon = tk.Button(self.master, image=self.startIcon, command=self.Dunjon, cursor="hand1")
        Enter_The_Dunjon.place(x=440, y=67)

        self.Enter_The_Dunjon = Enter_The_Dunjon

        self.Attack_Stroke, self.Spell_Heal, self.Attack_Fireball, self.Attack_Earthquake =Attack_Stroke, Spell_Heal, Attack_Fireball, Attack_Earthquake

        manaRegenerationThread = threading.Thread(target=lambda: self.manaRegeneration(self.dynamicManaBarCoord))
        manaRegenerationThread.setDaemon(True)
        manaRegenerationThread.start()

        deathEventHandlerThread = threading.Thread(target=lambda: self.deathEventHandler(self.dynamicHealthBarCoord))
        deathEventHandlerThread.setDaemon(True)
        deathEventHandlerThread.start()

        #m = threading.Thread(target=lambda: manaRegeneration(dynamicManaBarCoord))
        #m.start()

    def Stroke(self, healthCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

    def Heal(self, healthCoordList) :
        healthCoordList[2], healthCoordList[4] = 214, 195
        self.playerInfo.coords(self.dynamicHealthBar, healthCoordList)

    def FireBall(self, healthCoordList, manaCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

        manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 5, manaCoordList[4] - 5
        self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
        self.master.update()

        i = threading.Thread(target=self.timerFireBall)
        i.setDaemon(True)
        i.start()

    def EarthQuacke(self, healthCoordList, manaCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

        manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 25, manaCoordList[4] - 25
        self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
        self.master.update()

        i = threading.Thread(target=self.timerEarthQuacke)
        i.setDaemon(True)
        i.start()

    def timerStroke(self) :
        self.Attack_Stroke.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Stroke.configure(state="active")
        self.master.update()

    def timerHeal(self) :
        self.Spell_Heal.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Spell_Heal.configure(stae="active")
        self.master.upgrade()

    def timerFireBall(self) :
        self.Attack_Fireball.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Attack_Fireball.configure(state="active")
        self.master.update()

    def timerEarthQuacke(self) :
        self.Attack_Earthquake.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Attack_Earthquake.configure(state="active")
        self.master.update()

    def manaRegeneration(self, manaCoordList) :
        while True :
            if manaCoordList[2] < 114 :
                manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 1, manaCoordList[4] + 1
                self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
                self.master.update()
                time.sleep(0.90)

            elif manaCoordList[2] >= 114 :
                manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 0, manaCoordList[4] + 0
                self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
                self.master.update()

    def deathEventHandler(self, healthCoordList) :
        while True :
            if healthCoordList[2] < 10 :
                self.master.destroy()

    def Dunjon(self) :
        self.Enter_The_Dunjon.place_forget()

        ennemyInfoFrame = tk.LabelFrame(self.mainWindowFrame, width=420, height=165, bg="black", bd=3)
        ennemyInfoFrame.place(x=300, y=10)

        ennemyInfo = tk.Canvas(ennemyInfoFrame, bg="black", width=415, height=160, bd=0, highlightthickness=0, relief='ridge')
        ennemyInfo.place(x=0, y=0)

        ennemyDynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34] 

        ennemyHealthBarForground = ennemyInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
        ennemyDynamicHealthBar = ennemyInfo.create_polygon(ennemyDynamicHealthBarCoord, fill="red", width=1)
        ennemyHealthBarBackground = ennemyInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)

        self.ennemyInfo, self.ennemyDynamicHealthBar = ennemyInfo, ennemyDynamicHealthBar

        self.Attack_Stroke.configure(state="active")
        self.Attack_Fireball.configure(state="active")
        self.Attack_Earthquake.configure(state="active")
        self.Spell_Heal.configure(state="active")

root = tk.Tk()
InGameWindow(root)
root.mainloop()
将tkinter作为tk导入
从tkinter导入字体
导入时间
导入线程
随机输入
类InGameWindow(对象):
定义初始(自我,主):
#窗口及其设置
self.master=master
windowWidth=self.master.winfo_screenwidth()
windowHeight=self.master.winfo_屏幕高度()
rootCoord=f“800x400+{int((windowWidth/2)-400)}+{int((windowHeight/2)-200)}”
大师头衔(“一个简单的RPG”)
几何硕士(rootCoord)
master.可调整大小(宽度=假,高度=假)
master.overrideredirect(False)
主配置(bg=“黑色”)
#以.png等格式导入文件。。。
levelIcon=tk.PhotoImage(file=“playerInfoIcon.png”)
fireballIcon=tk.PhotoImage(file=“fireball.png”)
earthquackeIcon=tk.PhotoImage(file=“earthquacke.png”)
strokecon=tk.PhotoImage(file=“stroke.png”)
healIcon=tk.PhotoImage(file=“heal.png”)
startIcon=tk.PhotoImage(file=“start.png”)
self.levelIcon=levelIcon
self.fireballIcon=fireballIcon
self.earthquackecon=Earthquackecon
self.strokeIcon=strokeIcon
self.healIcon=healIcon
self.startIcon=startIcon
#框架以创建花哨的边框和标题
主窗口框架=传统框架(主窗口,宽度=780,高度=380,bg=“黑色”)
主窗框位置(x=10,y=10)
attackButtonsFrame=tk.LabelFrame(主窗口框架,宽度=420,高度=165,bg=“黑色”,relief=“脊状”,bd=3)
附件按钮框架位置(x=300,y=210)
playerInfoFrame=tk.LabelFrame(主窗口框架,宽度=240,高度=365,bg=“黑色”,bd=3)
playerInfoFrame.place(x=10,y=10)
self.mainWindowFrame=mainWindowFrame
#画布和与玩家信息相关的东西
playerInfo=tk.Canvas(playerInfo框架,bg=“黑色”,宽度=225,高度=340,bd=0,高亮厚度=0,浮雕=ridge')
playerInfo.place(x=0,y=0)
self.playerInfo=playerInfo
#创建图形/图像的坐标
dynamicHealthBarCoord=[14,16,214,16,195,34,14,34]
dynamicManaBarCoord=[13,16+30,214-100,16+30,195-100,34+30,13,34+30]
self.dynamicHealthBarCoord,self.dynamicManaBarCoord=dynamicHealthBarCoord,dynamicManaBarCoord
healthbarforgfround=playerInfo.创建多边形(14,15,214,16,196,34,14,34,fill=“black”,outline=“black”,width=2)
dynamicHealthBar=playerInfo.创建多边形(dynamicHealthBarCoord,fill=“red”,width=1)
healthBarBackground=playerInfo.创建多边形(11,13,220,13,196,37,11,37,fill=“”,outline=“gray”,width=2)
ManabarForgfround=playerInfo.创建多边形(14,15+30,214-100,16+30,196-100,34+30,14,34+30,fill=“black”,outline=“black”,width=2)
dynamicManaBar=playerInfo.创建_多边形(dynamicManaBarCoord,fill=“blue”,width=1)
manabackground=playerInfo.创建多边形(11,13+30,220-99,13+30,196-99,37+30,11,37+30,fill=“”,outline=“gray”,width=2)
self.dynamicHealthBar,self.dynamicManaBar=dynamicHealthBar,dynamicManaBar
#钮扣
攻击按钮(主窗口框,图像=self.strokeIcon,命令=lambda:self.Stroke(dynamicHealthBarCoord),光标=“hand1”,状态=“禁用”)
攻击位置(x=346.67-10,y=242-15)
Spell_Heal=tk.按钮(主窗口框架,image=self.healIcon,command=lambda:self.Heal(dynamicHealthBarCoord),cursor=“hand1”,state=“disabled”)
法术治疗位置(x=533.33+10,y=242-15)
攻击\火球=tk.按钮(主窗口框,图像=self.fireballIcon,命令=lambda:self.Fireball(dynamicHealthBarCoord,dynamicManaBarCoord),cursor=“hand1”,state=“disabled”)
攻击火球位置(x=346.67-10,y=242+60)
攻击\地震=tk.按钮(主窗口框架,图像=self.earthquackeIcon,命令=lambda:self.EarthQuacke(DynamicAlthbarCoord,dynamicManaBarCoord),光标=“hand1”,状态=“禁用”)
地震发生地点(x=533.33+10,y=242+60)
输入_Dunjon=tk.按钮(self.master,image=self.startIcon,command=self.Dunjon,cursor=“hand1”)
输入Dunjon.place(x=440,y=67)
self.Enter_The_Dunjon=输入_The_Dunjon
自攻\中风,自攻\治疗,自攻\火球,自攻\地震=攻击\中风,自攻\治疗,攻击\火球,攻击\地震
manaRegenerationThread=threading.Thread(目标=lambda:self.manaRegeneration(self.dynamicManaBarCoord))
ManaRecreationThread.setDaemon(True)
manaRecreationThread.start()
deathEventHandler线程=threading.Thread(target=lambda:self.deathEventHandler(self.dynamicHealthBarCoord))
deathEventHandlerThread.setDaemon(True)
deathEventHandlerThread.start()
#m=线程。线程(目标=lambda:manarecoord(dynamicManaBarCoord))
#m、 开始()
def冲程(自我、健康合作列表):
healthCoordList[2],healthCoordList[4]=healthCoordList[2]-20,healthCoordList[4]-20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar,healthCoordList)
def Heal(自我、健康合作列表):
healthCoordList[2],healthCoordList[4]=214195
self.playerInfo.coords(self.dynamicHealthBar、healthCoordList)
def FireBall(自我、健康合作列表、管理合作列表):
healthCoordList[2],healthCoordList[4]=healthCoordList[2]-20,healthCoordList[4]-20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar,healthCoordList)
manaCoordList[2],manaCoordLis
Spell_Heal = tk.Button(mainWindowFrame, text='healIcon', 
       command=lambda: self.Heal(dynamicManaBarCoord), cursor="hand1", state="disabled")
def Heal(self, healthCoordList) :
    healthCoordList[2], healthCoordList[4] = 214, 195
    self.playerInfo.coords(self.dynamicManaBar, healthCoordList)