重画圆圈-python

重画圆圈-python,python,tkinter,Python,Tkinter,我这里有一段代码: from tkinter import * class player(): def __init__(self, radius, xcoordinate = 0, ycoordinate = 0): self.xcoordinate = xcoordinate self.ycoordinate = ycoordinate self.radius = radius def moveRight(self, ev

我这里有一段代码:

from tkinter import *


class player():
    def __init__(self, radius, xcoordinate = 0, ycoordinate = 0):
        self.xcoordinate = xcoordinate
        self.ycoordinate = ycoordinate
        self.radius = radius

    def moveRight(self, event):
        self.xcoordinate += 25
        self.draw()
        print("Right key pressed")
        print("x: " + str(self.xcoordinate))

    def moveLeft(self, event):
        self.ycoordinate += 25
        self.draw()
        print("Left key pressed")
        print("y: " + str(self.ycoordinate))

    def draw(self):
        world = client()
        world.title("World")
        world.bind('<Right>', self.moveRight)
        world.bind('<Left>', self.moveLeft)        
        canvas = Canvas(world, width=200, height=200, borderwidth=0,highlightthickness=0, bg="black")
        canvas.grid()
        canvas.draw_player(self.xcoordinate, self.ycoordinate, self.radius, fill="blue", width=4)
        world.mainloop()

class client(Tk):
    def __init__(self):
        super().__init__()
    def draw_player(self, x, y, r, **kwargs):
        return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)

    Canvas.draw_player = draw_player    

p1 = player(50)
p1.draw()
从tkinter导入*
类播放器():
def uuu init uuuu(自、半径、xcoordinate=0、yccoordinate=0):
self.xcoordinate=xcoordinate
self.ycoordinate=ycoordinate
自半径=半径
def moveRight(自身、事件):
自协调+=25
self.draw()
打印(“按下右键”)
打印(“x:+str(自协调))
def moveLeft(自身、事件):
自我协调+=25
self.draw()
打印(“按左键”)
打印(“y:+str(自协调))
def牵引(自):
world=client()
世界名称(“世界”)
世界绑定(“”,self.moveRight)
世界绑定(“”,self.moveLeft)
画布=画布(世界,宽度=200,高度=200,边界宽度=0,highlightthickness=0,bg=“黑色”)
canvas.grid()
canvas.draw_播放器(self.xcoordinate,self.yccoordinate,self.radius,fill=“blue”,width=4)
world.mainloop()
类客户端(Tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
def draw_播放器(self、x、y、r、**kwargs):
返回自我。创建椭圆(x-r,y-r,x+r,y+r,**kwargs)
Canvas.draw\u player=draw\u player
p1=玩家(50)
p1.绘图()
问题是每当我按下向右或向左箭头键时,它都会调用draw()方法。draw()方法构造一个新的客户机对象等

因此,最终打开多个窗口,每个窗口都有一个具有不同x和y坐标的圆。如何使调用draw()时,它只编辑x和y坐标,并在同一窗口上重新绘制圆

请不要建议使用pygame,我的IDE在尝试导入模块时会出错。

我假设

在同一窗口上重新绘制圆

表示移动圆,但不表示在同一空间中绘制第二个圆。对画布对象使用move()函数来执行此操作。请注意,必须保存对要移动的对象的引用。此外,moveLeft()函数也不支持

class Player():
    def __init__(self, master, radius, xcoordinate=100, ycoordinate=100):
        self.master=master
        self.xcoordinate = xcoordinate
        self.ycoordinate = ycoordinate
        self.radius = radius
        self.master.title("World")
        self.master.bind('<Right>', self.moveRight)
        self.master.bind('<Left>', self.moveLeft)        
        self.draw()  ## called once

    def moveRight(self, event):
        self.canvas.move(self.oval_id, 25, 0)
        print("Right key pressed")
        print("x: " + str(self.xcoordinate))

    def moveLeft(self, event):
        self.canvas.move(self.oval_id, 0, 25)
        print("Left key pressed")
        print("y: " + str(self.ycoordinate))

    def draw(self):
        self.canvas = Canvas(self.master, width=200, height=200,
                 borderwidth=0,highlightthickness=0, bg="black")
        self.canvas.grid()
        self.oval_id=self.canvas.create_oval(self.xcoordinate-self.radius,
                                        self.ycoordinate-self.radius, 
                                        self.xcoordinate+self.radius,
                                        self.ycoordinate+self.radius,
                                        fill="red")

master=Tk()
p1 = Player(master, 50)
master.mainloop()
class Player():
定义初始(自、主、半径,X坐标=100,Y坐标=100):
self.master=master
self.xcoordinate=xcoordinate
self.ycoordinate=ycoordinate
自半径=半径
自我。主人。头衔(“世界”)
self.master.bind(“”,self.moveRight)
self.master.bind(“”,self.moveLeft)
self.draw()##调用一次
def moveRight(自身、事件):
self.canvas.move(self.oval_id,25,0)
打印(“按下右键”)
打印(“x:+str(自协调))
def moveLeft(自身、事件):
self.canvas.move(self.oval_id,0,25)
打印(“按左键”)
打印(“y:+str(自协调))
def牵引(自):
self.canvas=canvas(self.master,宽度=200,高度=200,
borderwidth=0,highlightthickness=0,bg=“黑色”)
self.canvas.grid()
self.oval_id=self.canvas.create_oval(self.xcoordinate-self.radius,
自坐标-自半径,
自X坐标+自半径,
自坐标+自半径,
fill=“red”)
master=Tk()
p1=玩家(大师级,50)
master.mainloop()
我想

在同一窗口上重新绘制圆

表示移动圆,但不表示在同一空间中绘制第二个圆。对画布对象使用move()函数来执行此操作。请注意,必须保存对要移动的对象的引用。此外,moveLeft()函数也不支持

class Player():
    def __init__(self, master, radius, xcoordinate=100, ycoordinate=100):
        self.master=master
        self.xcoordinate = xcoordinate
        self.ycoordinate = ycoordinate
        self.radius = radius
        self.master.title("World")
        self.master.bind('<Right>', self.moveRight)
        self.master.bind('<Left>', self.moveLeft)        
        self.draw()  ## called once

    def moveRight(self, event):
        self.canvas.move(self.oval_id, 25, 0)
        print("Right key pressed")
        print("x: " + str(self.xcoordinate))

    def moveLeft(self, event):
        self.canvas.move(self.oval_id, 0, 25)
        print("Left key pressed")
        print("y: " + str(self.ycoordinate))

    def draw(self):
        self.canvas = Canvas(self.master, width=200, height=200,
                 borderwidth=0,highlightthickness=0, bg="black")
        self.canvas.grid()
        self.oval_id=self.canvas.create_oval(self.xcoordinate-self.radius,
                                        self.ycoordinate-self.radius, 
                                        self.xcoordinate+self.radius,
                                        self.ycoordinate+self.radius,
                                        fill="red")

master=Tk()
p1 = Player(master, 50)
master.mainloop()
class Player():
定义初始(自、主、半径,X坐标=100,Y坐标=100):
self.master=master
self.xcoordinate=xcoordinate
self.ycoordinate=ycoordinate
自半径=半径
自我。主人。头衔(“世界”)
self.master.bind(“”,self.moveRight)
self.master.bind(“”,self.moveLeft)
self.draw()##调用一次
def moveRight(自身、事件):
self.canvas.move(self.oval_id,25,0)
打印(“按下右键”)
打印(“x:+str(自协调))
def moveLeft(自身、事件):
self.canvas.move(self.oval_id,0,25)
打印(“按左键”)
打印(“y:+str(自协调))
def牵引(自):
self.canvas=canvas(self.master,宽度=200,高度=200,
borderwidth=0,highlightthickness=0,bg=“黑色”)
self.canvas.grid()
self.oval_id=self.canvas.create_oval(self.xcoordinate-self.radius,
自坐标-自半径,
自X坐标+自半径,
自坐标+自半径,
fill=“red”)
master=Tk()
p1=玩家(大师级,50)
master.mainloop()

通过将移动参数传递给单个函数,可以简化代码

from tkinter import *
from functools import partial

class player():
    def __init__(self, master, radius, xcoordinate=100, ycoordinate=100):
        self.master=master
        self.xcoordinate = xcoordinate
        self.ycoordinate = ycoordinate
        self.radius = radius
        self.master.title("World")
        self.master.bind('<Right>', partial(self.move_oval, 25, 0))
        self.master.bind('<Left>', partial(self.move_oval, -25, 0))
        self.master.bind('<Up>', partial(self.move_oval, 0, -25))
        self.master.bind('<Down>', partial(self.move_oval, 0, 25))
        self.draw()  ## called once

    def move_oval(self, x, y, event):
        self.canvas.move(self.oval_id, x, y)
        print("key pressed", x, y)

    def draw(self):
        self.canvas = Canvas(self.master, width=200, height=200,
                 borderwidth=0,highlightthickness=0, bg="black")
        self.canvas.grid()
        self.oval_id=self.canvas.create_oval(self.xcoordinate-self.radius,
                                        self.ycoordinate-self.radius, 
                                        self.xcoordinate+self.radius,
                                        self.ycoordinate+self.radius,
                                        fill="red")
master=Tk()
p1 = player(master, 50)
master.mainloop()
从tkinter导入*
从functools导入部分
类播放器():
定义初始(自、主、半径,X坐标=100,Y坐标=100):
self.master=master
self.xcoordinate=xcoordinate
self.ycoordinate=ycoordinate
自半径=半径
自我。主人。头衔(“世界”)
自主绑定(“”,部分(自移动椭圆,25,0))
自主绑定(“”,部分(自移动椭圆,-25,0))
自主绑定(“”,部分(自移动椭圆,0,-25))
自主绑定(“”,部分(自移动椭圆,0,25))
self.draw()##调用一次
def移动(自身、x、y、事件):
self.canvas.move(self.oval_id,x,y)
打印(“按键”,x,y)
def牵引(自):
self.canvas=canvas(self.master,宽度=200,高度=200,
borderwidth=0,highlightthickness=0,bg=“黑色”)
self.canvas.grid()
self.oval_id=self