白客小李666 2024-07-24 11:49 采纳率: 75%
浏览 2
已结题

python tkinter相对运动程序报错

我想用python tkinter做一个相对运动,就写了这些代码

 
from tkinter import *
main_win=Tk()
xb=80
yb=20
img=PhotoImage(file='1.png')
a=Label(main_win,image=img).place(x=800,y=240)
img2=PhotoImage(file='2.png')
b=Label(main_win,image=img2).place(x=xb,y=yb)
def up1():
    global b,xb,yb
    yb=yb-2
    b.place(x=xb,y=yb)
def down1():
    global b,xb,yb
    yb=yb+2
    b.place(x=xb,y=yb)
def left1():
    global b,xb,yb
    xb=xb+2
    b.place(x=xb,y=yb)
def right1():
    global b,xb,yb
    xb=xb-2
    b.place(x=xb,y=yb)
main_win.bind("<Up>",up1)
main_win.bind("<Down>",down1)
main_win.bind("<Left>",left1)
main_win.bind("<Right>",right1)
main_win.mainloop()


结果报错

img

这哪错了啊?望大家解答

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-07-24 12:22
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    好的,我们来详细分析并解决这个问题。首先,我们需要明确报错的原因,然后针对性地修改代码。

    问题分析

    1. 全局变量问题:在函数中使用全局变量时,需要先声明 global 关键字。
    2. Label 对象引用问题b 变量在初始化时被赋值为 place 方法的返回值,而 place 方法的返回值是 None,因此 b 实际上是 None,无法调用 place 方法。
    3. 事件绑定问题:在绑定事件时,需要传递事件参数。

    解决方案

    1. 修正全局变量声明:确保在函数中正确声明全局变量。
    2. 修正 Label 对象引用:将 b 变量改为实际的 Label 对象。
    3. 修正事件绑定:在事件处理函数中添加事件参数。

    修改后的代码

    from tkinter import *
    
    main_win = Tk()
    xb = 80
    yb = 20
    
    img = PhotoImage(file='1.png')
    a = Label(main_win, image=img).place(x=800, y=240)
    
    img2 = PhotoImage(file='2.png')
    b = Label(main_win, image=img2)
    b.place(x=xb, y=yb)
    
    def up1(event):
        global xb, yb
        yb -= 2
        b.place(x=xb, y=yb)
    
    def down1(event):
        global xb, yb
        yb += 2
        b.place(x=xb, y=yb)
    
    def left1(event):
        global xb, yb
        xb -= 2
        b.place(x=xb, y=yb)
    
    def right1(event):
        global xb, yb
        xb += 2
        b.place(x=xb, y=yb)
    
    main_win.bind("<Up>", up1)
    main_win.bind("<Down>", down1)
    main_win.bind("<Left>", left1)
    main_win.bind("<Right>", right1)
    
    main_win.mainloop()
    

    详细解释

    1. 全局变量声明

      • 在每个事件处理函数中,使用 global xb, yb 声明全局变量。
    2. Label 对象引用

      • b 变量改为实际的 Label 对象,即 b = Label(main_win, image=img2),然后在 place 方法中使用 b.place(x=xb, y=yb)
    3. 事件绑定

      • 在事件处理函数中添加 event 参数,即 def up1(event):def down1(event):def left1(event):def right1(event):

    通过以上修改,代码应该能够正常运行,实现相对运动的效果。希望这个解决方案能够帮助到你!

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月1日
  • 已采纳回答 7月24日
  • 创建了问题 7月24日