Tkinter框架
怎么用tkinter设计一个GUI,思路就是——首先创建一个根窗口对象(这个一定是最顶层的容器),然后创建容器组件和其它组件(可以嵌套在容器组件里面,容器组件里面还可以嵌套容器组件),给根窗口or组件绑定对应的事件和事件处理函数,而对于各个组件之间的位置关系和布局则通过组件的grid方法来完成。
少记忆,抓重点,是学一个新框架最快的方式。所以本文就忽略繁琐的参数了,知道框架大致怎么用,剩下的查文档就行了…
主要原因还是不擅长记忆,哈哈
grid方法实现Widget布局(组件布局管理)
grid方法以类似excel表格的方式实现组件的布局,这个方法核心的参数包括:
- row,column:设置当前组件所处的“excel表格”,整个表格的大小是
[max(row)+1] x [max(column)+1]
。 - rowspan,columnspan:类似于excel表格中的合并单元格,rowspan决定列方向上合并多少个单元格,columnspan决定行方向上合并多少个单元格。
- padx,pady:设置控件边界与控件边界和控件边界与窗口边界之间像素距离。
- sticky:设置控件之间的对齐方式,可选参数包括N、S、W、E,组合使用时可能会有拉伸效果。注意时以同行或同列的组件为基准进行最大程度的对齐。
Tk类的rowconfigure和columnconfigure方法
这两个方法可以用来控制用户缩放根窗口大小时对应的行和列的缩放比例
tkinter的四种内置数据类型
我们可以通过config方法再程序运行过程中修改组件的参数,但当某些控件具有相同的参数时,一个组件一个组件的去调用config修改就太繁琐了。一种解决方法是将参数设置为变量,通过修改变量的值就可以实现批量的修改。我们只能使用tkinter的内置数据类型,而不能直接使用python中的数据类型
- IntVar:整数类型
- StringVar:字符串类型
- DoubleVar:浮点数类型
- BooleanVar:bool类型
- get和set方法:获取和设置tkinter中变量对象的值
- trace方法:对变量进行追踪,如果发生修改(w模式)或读取(r模式)就会调用callback函数,注意callback函数必须包含name,index,mode这三个位置参数,这些参数会在callback被调用时自动传递给它。
tkinter中的容器类型组件
当设计的GUI比较复杂的时候,最好使用容器组件来管理其它的组件。容器组件和用TK创建的根窗口很类似,它是一种可以容纳组件的组件。再tkinter容器组件有4种
- Frame
- LabelFrame:和Frame的唯一区别就是这个容器组件的左上脚是带标签的
- Toplevel:和Frame的唯一区别就是这个容器组件是脱离根窗口的,回产生一个独立窗口,有自己的窗口标题,关闭这个窗口不会影响根窗口,但是如果根窗口被关闭那么这个容器组件对应的窗口也会被关闭
- Notebook:这个是ttk子模块下的一个容器组件,它的特点是通过选项卡来组织其它组件,当选择不同的选项时可以看到不同的子组件内容
将事件和函数绑定
在tkinter中事件和事件处理函数绑定有两种方式:(1)使用command参数(2)使用bind方法。同时tkinter支持一个组件对应多个事件进而绑定多个事件处理函数,同时也支持使用bind方法的add参数实现一个事件绑定多个事件处理函数。
- 组件状态改变事件和函数的绑定:通过组件的command参数来实现
- 鼠标事件和函数的绑定、键盘事件和函数的绑定都可以通过控件的bind方法来实现
如何将matplotlib嵌入到tkinter当中
将 Matplotlib 图像嵌入到 Tkinter 中,需要使用 FigureCanvasTkAgg 这个适配器类。这个类常用的方法如下
- draw方法:重新将figure对象上的图像渲染到tk中。
- get_tk_widget():FigureCanvasTkAgg 本身不是继承自 Tkinter 的 Widget 类,而是一个封装了 Matplotlib 绘图功能的对象,要想使用tkinter的布局管理器必须得是Widget对象,FigureCanvasTkAgg类使用这个方法返回内部创建的真实 Tkinter Canvas 组件,使其能被 Tkinter 的布局系统识别和处理。
推荐操作流程
- 创建一个figure对象,传递给FigureCanvasTkAgg,然后获取内部的Widget完成布局
- 与用matplolib绘图一致,在figure上绘图
- 调用draw方法重新渲染figure上的图形到gui中
怎么组织一个tkinter项目的结构
MVC架构是一种用于构建用户界面的软件设计模式,最早在1970年代由Trygve Reenskaug提出。该模式将系统划分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种分离的方式旨在提高代码的模块化程度,促进代码的重用和维护。各个部分的实现要求如下:
- Model(模型):管理数据和业务逻辑(如数据库操作、计算规则)
- View(视图):负责UI展示(如窗口、按钮、文本框)
- Controller(控制器):处理用户输入,协调Model和View的交互
该框架的数据流为——用户在视图上操作
一个好例子:https://www.runoob.com/design-pattern/mvc-pattern.html
tkinter中引入表格控件
目前用的是pandastable这个第三方库,使用非常简单,对数据的管理也非常方便,直接修改Table对象的model属性的df属性为新的dataframe,然后redraw方法重新绘制一下表格就ok了。