Python 在画布上移动对象?
如何使类中的对象在画布上移动?下面是一些代码,它只对形状有效,但对对象无效。我不擅长类和对象。如果你能帮助我,我将不胜感激Python 在画布上移动对象?,python,tkinter,Python,Tkinter,如何使类中的对象在画布上移动?下面是一些代码,它只对形状有效,但对对象无效。我不擅长类和对象。如果你能帮助我,我将不胜感激 from tkinter import * root = Tk() sirka = root.winfo_screenwidth() vyska = root.winfo_screenheight() canvas = Canvas(root , height = vyska,width = sirka,bg= "gray") canvas.place(x = -2,
from tkinter import *
root = Tk()
sirka = root.winfo_screenwidth()
vyska = root.winfo_screenheight()
canvas = Canvas(root , height = vyska,width = sirka,bg= "gray")
canvas.place(x = -2,y = -2)
root.attributes("-fullscreen",True)
ex = Button(root,text = 'exit',command =root.destroy)
ex.place(x =sirka - 27,y =0)
x1 = 400
y1 = 200
class stickman(object):
def __init__(self,head,body):
self.head = head
self.body = body
man = stickman(canvas.create_oval(x1,y1,x1+20,y1+20,fill = 'black'), canvas.create_rectangle(x1-10,y1+20,x1+30,y1+60,fill ='red' ))
def move(event):
global x1, y1
if event.char == "a":
canvas.move(man, -10, 0)
elif event.char == "d":
canvas.move(man, 10, 0)
elif event.char == "w":
canvas.move(man, 0, -10)
elif event.char == "s":
canvas.move(man, 0, 10)
root.bind("<Key>", move)
mainloop()
从tkinter导入*
root=Tk()
sirka=root.winfo_screenwidth()
vyska=root.winfo_屏幕高度()
画布=画布(根,高度=vyska,宽度=sirka,bg=“灰色”)
canvas.place(x=-2,y=-2)
属性(“-fullscreen”,True)
ex=按钮(root,text='exit',command=root.destroy)
ex.place(x=sirka-27,y=0)
x1=400
y1=200
类stickman(对象):
定义初始(自我、头部、身体):
self.head=头
self.body=身体
man=stickman(canvas.create_oval(x1,y1,x1+20,y1+20,fill='black'),canvas.create_矩形(x1-10,y1+20,x1+30,y1+60,fill='red'))
def移动(事件):
全局x1,y1
如果event.char==“a”:
画布。移动(人,-10,0)
elif event.char==“d”:
画布。移动(人,10,0)
elif event.char==“w”:
画布。移动(人,0,-10)
elif event.char==“s”:
画布。移动(人,0,10)
root.bind(“,move)
mainloop()
您必须单独移动每个元素
canvas.move(man.head, -10, 0)
canvas.move(man.body, -10, 0)
或在类中创建方法
def move(self, x, y):
canvas.move(self.head, x, y)
canvas.move(self.body, x, y)
然后你可以使用
man.move(-10, 0)
编辑:正如Bryan Oakley在评论中提到的-您还可以将同一标记指定给许多对象,并使用此标记移动所有对象
class Stickman:
def __init__(self, head, body):
self.head = head
self.body = body
canvas.itemconfig(head, tag='man') # tag=('man', 'man_head')
canvas.itemconfig(body, tag='man') # tag=('man', 'man_body')
def move(self, x, y):
canvas.move('man', x, y)
canvas.move(man.head,…)
,canvas.move(man.body,…)
这能回答你的问题吗?可以将相同的标记应用于多个对象,然后移动标记。与该标记关联的所有项目将一起移动。
#from tkinter import * # PEP8: `import *` is not preferred
import tkinter as tk
# --- classes --- (CamelCaseNames)
class Stickman:
def __init__(self, head, body): # PEP8: spaces after comma
self.head = head
self.body = body
self.speed_x = 0
self.speed_y = 0
def move(self, x, y):
canvas.move(self.head, x, y)
canvas.move(self.body, x, y)
# --- functions ---
def on_press(event):
if event.char == "a":
man.speed_x -= 10
elif event.char == "d":
man.speed_x += 10
elif event.char == "w":
man.speed_y -= 10
elif event.char == "s":
man.speed_y += 10
def on_release(event):
if event.char == "a":
man.speed_x -= -10
elif event.char == "d":
man.speed_x += -10
elif event.char == "w":
man.speed_y -= -10
elif event.char == "s":
man.speed_y += -10
def update_game():
man.move(man.speed_x, man.speed_y)
root.after(50, update_game) # update again after 100ms
# --- main ---
root = tk.Tk()
sirka = root.winfo_screenwidth()
vyska = root.winfo_screenheight()
canvas = tk.Canvas(root, height=vyska, width=sirka, bg="gray") # PEP8: formatting
canvas.place(x=-2, y=-2) # PEP8: formatting
root.attributes("-fullscreen", True)
ex = tk.Button(root, text='exit', command=root.destroy)
ex.place(x=sirka-27, y=0)
x1 = 400
y1 = 200
man = Stickman(canvas.create_oval(x1, y1, x1+20, y1+20, fill='black'), canvas.create_rectangle(x1-10, y1+20, x1+30, y1+60, fill='red'))
root.bind("<KeyPress>", on_press)
root.bind("<KeyRelease>", on_release)
update_game() # update first time
root.mainloop()
class Stickman:
def __init__(self, head, body):
self.head = head
self.body = body
canvas.itemconfig(head, tag='man') # tag=('man', 'man_head')
canvas.itemconfig(body, tag='man') # tag=('man', 'man_body')
def move(self, x, y):
canvas.move('man', x, y)