如何获取Tkinter对象位置?调用winfo_x()时触发AttributeError
Tkinter获取对象位置报错解决
问题代码
def fireBullet(event): global playerMovementSpeed, player playerX = player.winfo_x() playerY = player.winfo_y() bullet.setx(playerX) bullet.sety(playerY) for i in range(40): c.move(bullet, 0, bulletMovementSpeed) return player
报错信息
属性错误:‘int’对象没有属性‘x’(原英文:
AttributeError: 'int' object has no attribute 'x')
问题原因
调用player.winfo_x()时,player是整数类型而非Tkinter组件对象。通常这种情况是因为player是Canvas创建图形项(比如create_rectangle、create_image)时返回的整数ID,这类ID没有winfo_x()方法——该方法仅适用于Label、Frame这类窗口组件。
解决方案
如果player是Canvas上的图形项,改用Canvas的coords()方法获取位置:
def fireBullet(event): global playerMovementSpeed, player # 获取player图形项的坐标列表,格式为[x1, y1, x2, y2] player_coords = c.coords(player) playerX = player_coords[0] playerY = player_coords[1] # 若bullet是Canvas图形项,建议用coords方法设置位置,而非setx/sety c.coords(bullet, playerX, playerY, playerX + bullet_width, playerY + bullet_height) for i in range(40): c.move(bullet, 0, bulletMovementSpeed) return player
注:如果bullet也是Canvas图形项,setx()/sety()并非标准方法,需替换为Canvas的coords()方法来设置位置,根据子弹的尺寸调整坐标参数即可。
内容的提问来源于stack exchange,提问作者user22736297
相关产品推荐
相关产品推荐

