当前位置: 首页 > 后端技术 > Python

Python内置界面开发框架Tkinter简介C篇(文末有红蛋,今天是元宵节)

时间:2023-03-25 20:59:28 Python

以下内容是我的学习笔记。如需转载请在微信声明原文链接公众号「ENG八戒」https://mp.weixin.qq.com/s/B1...本文约2874字,耗时10分钟读书。内容不多,但也费了点力气。如果想交流,欢迎关注我,在评论区留言。谢谢大家点赞收藏分享分享进入正文前先说一件小事,本书公众号已更名为【ENG八戒】,原名【englyf】。更名的原因是什么?以后会告诉朋友的!另外,文末还有彩蛋哦,毕竟今天是元宵节啊!本文属于《Python 内置界面开发框架 Tkinter入门篇?乙》系列的第三篇文章,后续将从《Python 内置界面开发框架 Tkinter入门篇?乙》开始。欢迎关注我的微信公众号「ENG八戒」查看本系列相关文章。界面布局关于Tkinter框架的GUI布局,其实并没有官方的图形化工具可以使用,但是网上有一些开源的工具可以使用。这里不打算介绍这些gadgets的使用,而是直接使用framework提供的geometrymanager进行布局,比如上面提到的pack()就是其中之一。这里所说的几何管理器,也是其他框架中经常提到的布局管理器。Tkinter框架提供的布局管理器有:pack、grid和place。每个控件只能使用一个布局管理器,不同控件使用的布局管理器可以不同。形象地说,pack就是把控件打包在一个矩形区域里,这个区域足够大,可以放置控件,默认居中。pack是最简单的布局管理器,也称为包布局。尝试使用pack布局三个静态标签Label,默认设置(pack()传入参数为空)importtkinterastkwindow=tk.Tk()lbl_1=tk.Label(master=window,text="label1",fg="black",bg="red",width=10,height=5)lbl_1.pack()lbl_2=tk.Label(master=window,text="label2",fg="black",bg="黄色",width=10,height=5)lbl_2.pack()lbl_3=tk.Label(master=window,text="label3",fg="black",bg="blue",width=10,height=5)lbl_3.pack()window.mainloop()看显示效果,可以看到默认的pack会把父窗口window中的三个静态标签按顺序垂直顺序打包排列。那么,如果我需要水平排列这些标签怎么办?可以改lbl_1.pack(side=tk.LEFT)...lbl_2.pack(side=tk.LEFT)...lbl_3.pack(side=tk.LEFT)看显示效果包(side=tk.LEFT)TOP)等同于默认设置。其他参数和参数赋值说明的简要总结。在控件小部件将此控件包装在控件小部件中之后。AnchorNSEW(或子集)根据方向定位控件。NSEW表示东西南北四个方向。控件widget之前将这个控件包裹在控件widget中前面的expandbool类型的值随着父控件的扩展和收缩。fillNONE,X,Y,BOTH选择控件展开时填充的方向。ipadxamount在x方向添加内部填充ipadyamount在y方向添加内部填充padxamount在x方向添加填充padyamount在y方向添加padyamountFillsideTOP,BOTTOM,LEFT,RIGHT在添加控件的地方。很多时候开发界面需要让里面的控件跟随窗口自动拉伸尺寸。让我们看看上面的代码应该如何更改lbl_1.pack(fill=tk.BOTH,expand=tk.TRUE)...lbl_2.pack(fill=tk.BOTH,expand=tk.TRUE)...lbl_3.pack(fill=tk.BOTH,expand=tk.TRUE)开始了,没有Stretchthewindow再stretchtoseegrid。顾名思义,grid会将父窗口划分为行和列,然后根据调用时传入的参数row和column来决定要放置在对应行和列的控件。网格也称为格子布局。还是以静态标签为例,创建一个3x3的矩阵标签。为了突出显示每个标签的边界,这里需要添加一个Frame控件,将每个标签放在一个单独的Frame中。将tkinter导入为tkwindow=tk.Tk()foriinrange(3):forjinrange(3):frame=tk.Frame(master=window,relief=tk.RAISED,borderwidth=1)frame.grid(row=i,column=j)label=tk.Label(master=frame,text=f"Row{i}\nColumn{j}")label.pack()window.mainloop()可以看到,上面的例子布局时只需要Frame应用gridmanager,因为每个label都和Frame一一对应,所以label不需要重复应用grid布局。看一下显示效果。简单总结介绍一下其他参数。参数赋值指令。columnserialnumber指定要放置的列,从0开始paddinginydirectionrowrownumber指定放置的行,从0开始rowspannumber放置的控件跨越多少行NSEW对应于上、下、右、左边框。细心的朋友会发现,一旦上面的矩阵标签窗口被拉伸,窗口界面的底面就会露出一部分,而矩阵标签并不会一起被拉伸。这显然不符合我们的预期。如何解决这个问题呢?可以调用父窗口的columnconfigure()和rowconfigure()方法来配置各列和行的缩放比例。这两个方法都有三个输入参数,见下表参数说明索引序号,指定具体的行或列,可以是单个行或列的序号值,也可以是代表多行或多列的列表weightscalingweightminsizeminimumwidth现在让我们看看如何更改值,使矩阵标签可以随着父窗口一起拉伸?将tkinter导入为tkwindow=tk.Tk()foriinrange(3):window.rowconfigure(i,weight=1)window.columnconfigure(i,weight=1)forjinrange(3):frame=tk.Frame(master=window,relief=tk.RAISED,borderwidth=1)frame.grid(row=i,column=j)label=tk.Label(master=frame,text=f"行{i}\n列{j}")label.pack()window.mainloop()看拉伸后的显示效果完美!此外,应该提到的是,grid具有pack可以做的所有功能,但形式更简单,因此应该将其用作更高优先级的布局管理器。placeplace用于控件的精确定位。使用时需要传入参数x和y,分别指定控件的位置坐标x和y。传入的x和y是以父控件的左上角为原点的坐标系,单位是像素。在大多数界面应用中,控件不需要精确定位。但是有些应用程序(例如地图应用程序)确实需要元素的精确定位。举个栗子,在窗口的不同位置放置一个labelimporttkinterastkwindow=tk.Tk()label1=tk.Label(master=window,text="place(0,0)",bg="yellow")label1.place(x=0,y=0)label2=tk.Label(master=window,text="place(40,40)",bg="blue")label2.place(x=40,y=40)window.mainloop()看上面代码的显示效果。说起来,place这个参数的xy单位是pixel,所以在不同的系统下,字体类型和大小是不一样的,所以放置的控件可能会超出窗口边界。因此,place确实不常用,关于place的进一步信息将不再展开。交互上面介绍的内容仅限于Tkinter界面的视觉设计,所以现在是时候介绍一下Tkinter界面与用户的交互了。例如,Tkinter接口如何响应事件?一般通过在Tkinter中预先绑定事件和响应处理函数,每当有事件发生时,主窗口的mainloop会接收到该事件,然后根据绑定信息查找并调用响应处理函数,实现交互效果。绑定的一般方法是调用每个控件的bind()。例如,我们来实现一个简单的键盘响应交互,每次按下一个键,打印出对应的键importtkinterastkdefhandle_keypress(event):print(event.char)window=tk.Tk()windowbind("",handle_keypress)window.mainloop()上面的代码没有添加额外的控件,除了一个空白的主窗口。其中,按键事件Key和处理函数handle_keypress绑定在主窗口window上。调用bind()至少需要两个参数,一个是“”形式的事件,另一个是事件处理器。当处理函数handle_keypress被定义时,它唯一做的就是将传入的事件字符打印到标准终端。每当按下键盘上的某个键时,命令行终端就会输出相应的键。而对于按钮Button,点击事件的触发处理不需要使用bind(),只需要在实例化控件Button时将处理函数传入command参数,初始化过程会自动绑定response的点击事件。看上面代码importtkinterastkdefhandle_keypress():print("clicked")window=tk.Tk()button=tk.Button(master=window,text="clickme!",command=handle_keypress)button。pack()window.mainloop()运行程序,用鼠标点击界面上的按钮,发现终端会输出clicked的字符串。限于篇幅,本系列教程还没有结束。下一篇《Python 内置界面开发框架 Tkinter入门篇 丁》会在这个《Python 内置界面开发框架 Tkinter入门篇 丁》如果您对本教程感兴趣或者想和我交流更多精彩内容,请关注我的微信公众号【ENG八戒】,等你哦!《元宵彩蛋》元宵节,《八戒陪你一起闹元宵2023》