【发布时间】:2019-07-21 01:53:05
【问题描述】:
我正在使用 Python 和 tkinter 创建一个 GUI。我创建了两个类,App 和 drawBall。 App 类继承自 Tk.Frame。我无法从App 中创建drawBall 对象。
我也非常感谢有关我的代码的任何其他反馈,我对 OOP 还很陌生。
创建类App后,继承自Tk.Frame。我想创建另一个类来在屏幕上绘制一个球(使用画布)。我创建了一个基本 GUI,但在尝试调用 drawBall 类时,我收到以下错误:'drawBall' 对象没有属性'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 = drawBall(self.master,self.canvas)”会导致在屏幕上绘制圆。
【问题讨论】:
-
您在
drawBall中忘记了self.canvas = canvas。在drawBall中不需要master。 -
使用名词作为类名是个好规则——即。
class Ball- 仅用于函数名称的动词 - (def moveBall)。如果您的班级是Ball,那么没有理由在moveBall中使用名称Ball,使用move()而不是moveBall()、moveSquare()、moveSomethingElse()会更容易。您可以将它们保留在列表中并使用for item in list: item.move()
标签: python python-3.x class animation tkinter