如何从另一个类中设置一个类的对象的动画?

2024-09-19 23:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python和tkinter来创建GUI。我创建了两个类,AppdrawBallApp类继承自Tk.Frame。在App中创建drawBall对象时遇到问题

我也很感激关于我的代码的任何其他反馈,我对OOP还相当陌生

创建从Tk.Frame继承的类App之后。我想创建另一个类在屏幕上绘制一个球(使用画布)。我已经创建了一个基本GUI,但是在尝试调用类drabull时,我收到以下错误:“drabull”对象没有属性“canvas”

class App(tk.Frame):

      def __init__(self,master):
          super().__init__(master)

        #create title and size for the window
           self.master.geometry("640x360")

           self.canvas = tk.Canvas(self.master,relief = 'raised',borderwidth = 1)
           self.canvas.grid(row = 0,column = 0,sticky = 'NW')



        #create a startSimulation button, place it in the bottom right corner
           self.startButton = tk.Button(self.master,text = 'Start',command = self.startCallback)
           self.startButton.grid(row = 2,column = 3)

        #create a quit button, place it in the bottom right corner
           self.quitButton = tk.Button(self.master,text = "Quit",command = self.master.destroy)
           self.quitButton.grid(row = 3, column =3)


    #callback for start button click
       def startCallback(self):
            #### this is where the error occurs #####
            self.ball1 = drawBall(self.master,self.canvas) 


class drawBall():
     def __init__(self,master,canvas):
         self.canvas.create_oval(25,75,35,85,fill = 'blue')


     def moveBall(self):
         deltaX = 1
         self.canvas.move(self.seed,deltaX,0)
         self.canvas.after(50,self.moveBall)


if __name__ == '__main__':

    window = tk.Tk()
    simulate = App(window)
    window.mainloop()

我希望调用“self.ball1=trabill(self.master,self.canvas)”会导致在屏幕上绘制圆


Tags: theselfmasterappinitdefcreatewindow
1条回答
网友
1楼 · 发布于 2024-09-19 23:28:44

你需要一个类Ball,它需要一个canvas,并且有能力移动自己。
然后,在App中,创建一个球的集合,并命令它们移动

像这样:

import tkinter as tk


class App(tk.Frame):

    def __init__(self, master):
        super().__init__(master)

        self.master.geometry("640x360")

        self.canvas = tk.Canvas(self.master, relief='raised', borderwidth=1)
        self.canvas.grid(row=0, column=0, sticky='NW')

        self.startButton = tk.Button(self.master, text='animate', command=self.launch_animation)
        self.startButton.grid(row=2, column=3)

        self.stopButton = tk.Button(self.master, text='stop', command=self.stop_animation)
        self.stopButton.grid(row=3, column=3)

        self.quitButton = tk.Button(self.master, text="Quit",command=self.master.destroy)
        self.quitButton.grid(row=4, column=3)

        self.balls = [Ball(self.canvas)]

        self.anim_is_on = False

    def stop_animation(self):
        self.anim_is_on = False

    def launch_animation(self):
        if self.anim_is_on:      # prevent launching several overlapping animation cycles
            return
        self.anim_is_on = True
        self.animate()

    def animate(self):
        if not self.anim_is_on:
            return
        for ball in self.balls:
            ball.moveball()
        self.after(100, self.animate)


class Ball():

    def __init__(self, canvas):
        self.canvas = canvas
        self.id = self.canvas.create_oval(25, 75, 35, 85, fill='blue')

    def moveball(self):
        delta_x = 1
        self.canvas.move(self.id, delta_x, 0)


window = tk.Tk()
simulate = App(window)
window.mainloop()

相关问题 更多 >