The only difficulty i've encountered is whenever i run my program,
there's an error name 'SmileyFace' is not defined ...
当我尝试运行它时,在修复了缩进问题之后,我得到NameError: name 'righteye' is not defined。修复后,由于结尾缺少win.mainloop(),所以在运行它时根本没有发生任何事情。修复后,由于调用了.pack而不是.pack(),我没有看到任何按钮。等等。在
你把这个计划安排得很糟糕。SmileyFace构造函数应该绘制出基本的面部,并将右眼和嘴巴对象保存为属性,而不是尝试将它们作为全局变量处理。下面,我采用一种更简单的方法,即使用标记来避免属性和全局变量一起出现:from tkinter import *
class SmileyFace:
def __init__(self, canvas):
self.canvas = canvas
canvas.create_oval(70, 70, 350, 350, fill='yellow')
canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')
def smile(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')
def sad(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')
def wink(self):
self.canvas.delete('right||mouth')
self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')
def grin(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')
def main():
win = Tk()
canvas = Canvas(win, width=800, height=800)
canvas.pack()
smiley = SmileyFace(canvas)
Button(win, text='Smile', command=smiley.smile).pack()
Button(win, text='Sad', command=smiley.sad).pack()
Button(win, text='Wink', command=smiley.wink).pack()
Button(win, text='Grin', command=smiley.grin).pack()
Button(win, text='Quit', command=win.destroy).pack()
win.mainloop()
main()