🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
上节课我们学习了使用tkinter开发用户界面。这节课,我们用tkinter重新实现一下备忘清单,给备忘清单加一个图形界面。 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536428077345&di=a0535deff61f692fd927b946a1751195&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D2130f3273ffae6cd18b9a32267da6551%2F7a899e510fb30f24f4bcfe13c295d143ad4b03ff.jpg) ## 渲染备忘清单列表 ![](https://s1.ax1x.com/2018/09/08/iPORWn.png) 首先,我们使用`ListBox`渲染备忘列表。我们使用for循环迭代todo实例中的每个备忘,插入到`ListBox`。然后调用`pack()`方法渲染列表。 ## 新增备忘 ![](https://s1.ax1x.com/2018/09/08/iPOoeU.png) 首先,我们使用`Entry`空间渲染一个输入框。然后定义一个`Button`,并给它绑定上`saveTask`函数。 在saveTask函数中,我们获取`Entry`控件里的内容,并调用todo对象的`addTodo`方法完成备忘存储。 ## 刷新列表 ![](https://s1.ax1x.com/2018/09/08/iPOXS1.png) 新增备忘后,界面上的备忘列表并没有被刷新调用。因此,我们将下面的这段代码抽成函数: ~~~ for task in todo.getAllToto(): taskListBox.insert(0, task) taskListBox.pack() ~~~ 在程序运行和新增备忘后调用这个函数,完成新备忘信息的界面同步。 ## 删除任务 ![](https://s1.ax1x.com/2018/09/08/iPX9Te.png) 删除列表的代码稍微有点复杂。我们给`taskListBox` 绑定了一个函数。注意我们使用的事件名字是:`<<ListboxSelect>>`。在删除备忘代码里,我们通过解析`event`对象的`widget`属性,从而获得当前点击的是哪个备忘下标。 完成这个功能后,我们的图形化备忘清单就完成了。怎么样,会做了吗?当我们需要做图形界面时,记得找到正确的空间就可以完成我们的程序开发了。 完整代码如下: ``` from tkinter import * class Todo: def __init__(self): self.taskList = [] self.__fileLocation__ = "./todo.txt" self.__loadTask__() def addTodo(self, thing): self.taskList.append(thing) self.__saveTodo__() return True def removeTodo(self, thing): if not thing in self.taskList: return False else: self.taskList.remove(thing) self.__saveTodo__() return True def searchTodo(self, thing): for todo in self.taskList: if thing in todo: return todo return None def getAllToto(self): return self.taskList def __loadTask__(self): file = open(self.__fileLocation__, 'r') self.taskList = file.readlines() def __saveTodo__(self): file = open(self.__fileLocation__, 'w') file.write('\n'.join(self.taskList)) file.close() def saveTask(): task = entry.get() if task in todo.getAllToto(): print('error') button['background'] = 'red' button.pack() else: todo.addTodo(entry.get()) loadTask() def loadTask(): for task in todo.getAllToto(): print(task) listBox.insert(0, task) listBox.pack() def removeTask(event): index = event.widget.curselection()[0] print(todo.getAllToto()[index]) todo = Todo() root=Tk() listBox=Listbox(root) listBox.bind('<<ListboxSelect>>', removeTask) loadTask() entry = Entry(root) entry.pack() button = Button(root,text='新增',command=saveTask) button.pack() root.mainloop() ``` ## 总结 这节课,我们使用tkinter逐步完成了一个界面版的备忘清单。从程序开发中我们可以感知到,图形界面开发首先要做功能分解。然后按照视图层(button),逻辑层(函数),实现(Todo类)分层开发。代码得到了有效隔离。当然,这个项目还可以进一步优化。将图形界面的UI部分再做一个类,使代码得到更好的封装。 在后续的课程里,我们会再迭代出一个web版的任务清单,小朋友们可以多对比这几个版本的区别。整个程序的代码,阿达老师会上传到git上,方便大家下载查看。 **阿达老师-孩子身边的编程专家** *完整课程请关注阿达老师,主页里有完整的课程目录和观看地址*