我如何才能更新我的tkinter游戏只有当有一个点击事件?

2024-09-29 21:43:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个游戏,我只想在使用mouseClickHandler之后更新rungame()。你知道吗

这就是我在runGame()中所做的:

 def runGame():
    global i,update,scoreDraw,questionA

    setInitialValues()
    drawObjects()

    if update == True:

        questionAsk()
        canvas.update()
        i += 1
        updateObjects()
        checkForCollisions()
        canvas.delete(scoreDraw,questionA)
        canvas.update()

这就是runGame()所做的:

def setInitialValues():
    global score, time, update, worldGIF


    score = 0
    time = 0
    update = True
    worldGIF = PhotoImage(file = "WorldMap.gif")

def drawObjects():

    global worldMap,scoreStart,questionAA

    worldMap = canvas.create_image(650, 400, image = worldGIF)
    scoreStart = canvas.create_text(500,600,text=score, font= 'Times 24', anchor = W, fill = "white")
    questionAA = canvas.create_text(400,700, text="Hello!", font= "Times 20", anchor = W,fill = "white")
    canvas.update()

def questionAsk():
    global x_coord, y_coord, country, question, i
    global question
    question = "Where is", country[i],"?"

def updateObjects():
    global scoreDraw, questionA
    roundScore = round(score)
    scoreDraw = canvas.create_text(500,600,text=roundScore, font= 'Times 24', anchor = W, fill = "white")
    questionA = canvas.create_text(400,700, text=question, font= "Times 20", anchor = W,fill = "white")
    canvas.update()

def mouseClickHandler( event ):
    global i, xMouse,yMouse,answerx,answery,score,distance,update
    canvas.delete(scoreStart,questionAA)
    xMouse = event.x
    yMouse = event.y
    answerx = x_coord[i]
    answery = y_coord[i]
    delta_x = abs(xMouse - answerx)
    delta_y = abs(yMouse - answery)
    distance = sqrt((delta_x)**2+(delta_y)**2)
    score = score + distance
    update = True

但是它从不更新,因为某些原因,它只是没有检测到mouseClickHandler中的update = True语句。你知道吗

额外费用:

x_coord, y_coord, country都是我之前制作的numpy数组,导入到这里。worldGIF只是一张地图的图片。你知道吗

所以tldr;我找不到只在有点击的地方触发runGame()中的if update == True部分的方法。你知道吗

这些在底部绑定:

root.after( 0, runGame )

canvas.bind( "<Button-1>", mouseClickHandler )

canvas.bind( "<Key>", keyDownHandler )

canvas.bind( "<KeyRelease>", keyUpHandler )

canvas.pack()

canvas.focus_set() 

Tags: texttruedefcreateupdateglobalcanvasscore
1条回答
网友
1楼 · 发布于 2024-09-29 21:43:22

如果您想在每次鼠标点击时运行runGame,您需要在mouseClickHandler中调用它(假设该函数绑定到一个点击事件)

例如:

canvas.bind("<1>", runGame)

def mouseClickHandler( event ):
    global i, xMouse,yMouse,answerx,answery,score,distance,update
    ...
    update = True
    runGame()

然而

我猜您不希望每次单击都运行runGame,而只希望if块中的代码运行。如果这是真的,那么将代码移到一个单独的块中,并从mouseClickHander调用它,并消除update变量的使用。你知道吗

例如:

def runGame():
    global i,scoreDraw,questionA
    setInitialValues()
    drawObjects()
    updateGame()

def updateGame():
    global i

    questionAsk()
    canvas.update()
    i += 1
    updateObjects()
    checkForCollisions()
    canvas.delete(scoreDraw,questionA)
    canvas.update()

def mouseClickHandler( event ):
    global i, xMouse,yMouse,answerx,answery,score,distance
    canvas.delete(scoreStart,questionAA)
    ...
    score = score + distance
    updateGame()

相关问题 更多 >

    热门问题