Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在画布上移动对象?_Python_Tkinter - Fatal编程技术网

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)