调用类方法来更改位置的最佳方法tkinter python类

时间:2017-09-22 17:09:59

标签: python class methods tkinter

我有以下代码,它试图创建另外两个不同颜色和不同位置的Ball类实例。目前,创建椭圆并指定其位置的方法位于 init 方法中。

问题:我曾尝试创建ball2和ball3(创建类Ball的实例),但它们没有用。由于显而易见的原因,他们覆盖了ball1。

我正在寻求一些有关答案(代码)的最佳解决方案的建议

最好直接从现在的位置调用方法,如果是这样,怎么办? (我尝试了各种不起作用的东西)。

否则,创建一种新的绘制球的方法是否更加pythonic或高效,如果是这样,你能否提供这个作为答案。

答案理想情况下包含上述内容,以及解释或任何其他替代方案(如果有)。

以下代码

class Ball: #create a ball class
    def __init__(self,canvas,color): #initiliased with the variables/attributes self, canvas, and color
        self.canvas=canvas #set the intiial values for the starting attributes
        self.id=canvas.create_oval(30,30,50,50,fill=color) #starting default values for the ball
        """ Note: x and y coordinates for top left corner and x and y coordinates for the bottom right corner, and finally the fill colour for the oval
        """
        self.canvas.move(self.id,0,0) #thia moves the oval to the specified location

    def draw(self): #we have created the draw method but it doesn't do anything yet.
        pass 


ball1=Ball(canvas,'green') #here we are creating an object (green ball) of the class Ball

ball2=Ball(canvas,'blue')
ball3=Ball(canvas,'purple')

例如,尝试将其移动到我尝试过的方法中,但没有运气:

 def moveball(x_position,y_position):
        self.canvas.move(self.id,0,0)


ball3=Ball(canvas,'purple')
ball3.moveball(100,100)

错误:

    ball3.moveball(100,100)
TypeError: moveball() takes 2 positional arguments but 3 were given

2 个答案:

答案 0 :(得分:1)

为防止出现错误,您需要添加self作为moveball的参数,如果它在您的球类中。 (这需要是第一个参数)

你的球不会互相“覆盖”,它们只是按照你创建它们的顺序在画布上相互显示。

您可以通过在创建后移动它们(指定x和y数量)或通过传递初始坐标(x1,y1,x2,y2或x,y然后使用偏移量)来阻止这种情况。

答案 1 :(得分:0)

刚发现这个,确实有效。显然会等着看是否有人提出更好或更有效的方法。

创建以下方法:

def move(self,x,y): #we have created the draw method but it doesn't do anything yet.
        canvas.move(self.id,x,y)

像这样调用ball3:

ball3.move(100,200)

如问题所示,这会在另一个位置向屏幕产生另一个球。