重绘圈 - python

时间:2015-11-20 18:29:13

标签: 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, 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()

问题在于每当我按下向右或向左箭头键时,它都会调用draw()方法。 draw()方法构造一个新的客户端对象等。

所以你最终会打开多个窗口,每个窗口都有一个带有不同x和y坐标的圆圈。我如何做到这一点,当我调用draw()时,它只编辑x和y坐标,并在同一个窗口上重绘圆圈?

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

2 个答案:

答案 0 :(得分:4)

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

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()

答案 1 :(得分:1)

我认为

  

在同一窗口上重绘圆圈

表示移动圆圈,并不意味着在同一空间中绘制第二个圆圈。对canvas对象使用move()函数执行此操作http://effbot.org/tkinterbook/canvas.htm。请注意,您必须保存对要移动的对象的引用。你的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()