Tkinter 面向对象框架《一》

一、说明

        在本教程中,您将学习如何在 Tkinter 中应用面向对象编程以使代码更有条理。首先介绍Tk下小部件,然后介绍Ttk小部件,即如何从ttk.Frame类继承并在根窗口中使用它。

二、定义 Tkinter 面向对象的窗口

2.1 最基本的对象

        以下简单程序创建一个根窗口并将其显示在屏幕上:

import tkinter as tk
root = tk.Tk()
root.mainloop()

当程序变得越来越复杂时,可以使用面向对象的编程方法使代码更有条理。

下面的程序实现与上面的程序相同的结果,但使用 aclass代替:

import tkinter as tkclass App(tk.Tk):def __init__(self):super().__init__()if __name__ == "__main__":app = App()app.mainloop()

怎么运行的。

  • 首先,定义一个App类,继承该类tk.Tk。在方法内部__init__(),调用类__init__()的方法tk.Tk
  • 其次,创建该类的新实例App并调用该mainloop()方法来显示根窗口。

2.2 Tkinter 中面向对象窗口的另一个示例

下面的类表示一个由标签和按钮组成的窗口。当您单击该按钮时,程序会显示一个消息框:

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfoclass App(tk.Tk):def __init__(self):super().__init__()# configure the root windowself.title('My Awesome App')self.geometry('300x50')# labelself.label = ttk.Label(self, text='Hello, Tkinter!')self.label.pack()# buttonself.button = ttk.Button(self, text='Click Me')self.button['command'] = self.button_clickedself.button.pack()def button_clicked(self):showinfo(title='Information', message='Hello, Tkinter!')if __name__ == "__main__":app = App()app.mainloop()

它的工作原理。

  • 首先,在__init__()App类的方法中创建一个标签和按钮。
  • 其次,将button_clicked()方法分配给按钮的命令选项。在该button_clicked()方法内,显示一个消息框。
  • 第三,将应用程序引导移至该if __name__ = "main"块。

2.3 小结

  • 使用面向对象的编程方法使代码更有条理。
  • 定义一个类,继承该类tk.Tk。始终super().__init__()在子类中从父类调用 。

三、关于Ttk的原理

        上面您学习了如何对类进行子类化。但是,一个 Tkinter 应用程序应该只有一个实例。 因此,从 ttk 继承是很常见的。Frame 类并在根窗口中使用子类。

ttk介绍: 是增强版的tk,其中有17个图形类,包括tk中的11个类:
Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale, Scrollbar
ttk新增的6个: Combobox, Notebook, Progressbar, Separator, Sizegrip, Treeview
这17个类都继承自 Widget。

3.2 ttk,Frame继承和实例化

        若要继承该类,请使用以下语法:ttk.Frame

class MainFrame(ttk.Frame):pass

        由于 Frame 需要一个容器,因此您需要向其 __init__() 方法添加一个参数,并调用 ttk.Frame 类的 __init__() 方法,如下所示:

class MainFrame(ttk.Frame):def __init__(self, container):super().__init__(container)  

        下面显示了具有标签和按钮的完整类。单击该按钮时,它会显示一个消息框:MainFrame

class MainFrame(ttk.Frame):def __init__(self, container):super().__init__(container)options = {'padx': 5, 'pady': 5}# labelself.label = ttk.Label(self, text='Hello, Tkinter!')self.label.pack(**options)# buttonself.button = ttk.Button(self, text='Click Me')self.button['command'] = self.button_clickedself.button.pack(**options)# show the frame on the containerself.pack(**options)def button_clicked(self):showinfo(title='Information',message='Hello, Tkinter!')

        下面定义了一个继承自Tk类的类:App

class App(tk.Tk):def __init__(self):super().__init__()# configure the root windowself.title('My Awesome App')self.geometry('300x100')

        您可以通过块引导应用程序。if __name__ == "__main__"

if __name__ == "__main__":app = App()frame = MainFrame(app)app.mainloop()

在此代码中:

  • 首先,创建该类的新实例。App
  • 其次,创建类的新实例,并将其容器设置为应用实例。MainFrame
  • 第三,通过调用 app() 启动应用程序。它将执行将调用根窗口的方法。__call__()mainloop()

把它们放在一起:

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfoclass MainFrame(ttk.Frame):def __init__(self, container):super().__init__(container)options = {'padx': 5, 'pady': 5}# labelself.label = ttk.Label(self, text='Hello, Tkinter!')self.label.pack(**options)# buttonself.button = ttk.Button(self, text='Click Me')self.button['command'] = self.button_clickedself.button.pack(**options)# show the frame on the containerself.pack(**options)def button_clicked(self):showinfo(title='Information',message='Hello, Tkinter!')class App(tk.Tk):def __init__(self):super().__init__()# configure the root windowself.title('My Awesome App')self.geometry('300x100')if __name__ == "__main__":app = App()frame = MainFrame(app)app.mainloop()

输出:

3.3 更多面向对象框架示例

        下面的示例使用这些类从“框架”教程转换“替换”窗口:

import tkinter as tk
from tkinter import ttkclass InputFrame(ttk.Frame):def __init__(self, container):super().__init__(container)# setup the grid layout managerself.columnconfigure(0, weight=1)self.columnconfigure(0, weight=3)self.__create_widgets()def __create_widgets(self):# Find whatttk.Label(self, text='Find what:').grid(column=0, row=0, sticky=tk.W)keyword = ttk.Entry(self, width=30)keyword.focus()keyword.grid(column=1, row=0, sticky=tk.W)# Replace with:ttk.Label(self, text='Replace with:').grid(column=0, row=1, sticky=tk.W)replacement = ttk.Entry(self, width=30)replacement.grid(column=1, row=1, sticky=tk.W)# Match Case checkboxmatch_case = tk.StringVar()match_case_check = ttk.Checkbutton(self,text='Match case',variable=match_case,command=lambda: print(match_case.get()))match_case_check.grid(column=0, row=2, sticky=tk.W)# Wrap Around checkboxwrap_around = tk.StringVar()wrap_around_check = ttk.Checkbutton(self,variable=wrap_around,text='Wrap around',command=lambda: print(wrap_around.get()))wrap_around_check.grid(column=0, row=3, sticky=tk.W)for widget in self.winfo_children():widget.grid(padx=0, pady=5)class ButtonFrame(ttk.Frame):def __init__(self, container):super().__init__(container)# setup the grid layout managerself.columnconfigure(0, weight=1)self.__create_widgets()def __create_widgets(self):ttk.Button(self, text='Find Next').grid(column=0, row=0)ttk.Button(self, text='Replace').grid(column=0, row=1)ttk.Button(self, text='Replace All').grid(column=0, row=2)ttk.Button(self, text='Cancel').grid(column=0, row=3)for widget in self.winfo_children():widget.grid(padx=0, pady=3)class App(tk.Tk):def __init__(self):super().__init__()self.title('Replace')self.geometry('400x150')self.resizable(0, 0)# windows only (remove the minimize/maximize button)self.attributes('-toolwindow', True)# layout on the root windowself.columnconfigure(0, weight=4)self.columnconfigure(1, weight=1)self.__create_widgets()def __create_widgets(self):# create the input frameinput_frame = InputFrame(self)input_frame.grid(column=0, row=0)# create the button framebutton_frame = ButtonFrame(self)button_frame.grid(column=1, row=0)if __name__ == "__main__":app = App()app.mainloop()

3.4 小结

  • 子类化并初始化框架上的小部件。ttk.Frame
  • 在根窗口中使用 的子类。ttk.Frame

四、总结

        本文阐述了如何在Tkinter上使用面向对象的编程方法,更多的和更需要掌握的是消息原理。在系列文章的下篇我们将集中阐述事件和绑定问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208078.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字媒体技术基础之:栅格图像与矢量图形

使用各种软件创建不同类型的复合图像和图稿时,常会遇到基本的数字图像类型:栅格图像和矢量图像。 ◆ ◆ ◆ 栅格图像 栅格图像是基于像素的图像,故又称为“像素图像”或“位图图像”,主要用于编辑照片或制作可在 Web 上轻松使用…

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类,有一个属性叫做id,每个…

循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录 1.队列的定义 2.循环队列的设计图示 3.循环队列的结构设计 4.循环队列的实现 5.循环队列的总结 1.队列的定义 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一…

数据结构与算法之美学习笔记:29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?

目录 前言堆的应用一:优先级队列堆的应用二:利用堆求 Top K堆的应用三:利用堆求中位数解答开篇内容小结 前言 本节课程思维导图: 搜索引擎的热门搜索排行榜功能你用过吗?搜索引擎每天会接收大量的用户搜索请求&#x…

Shell循环:for(三)

示例:使用for实现批量主机root密码的修改 一、前提 已完成密钥登录配置(ssh-keygen)定义主机地址列表并了解远程修改密码的方法 [rootlocalhost ~]# ssh-keygen #设置免密登录[rootlocalhost ~]# ssh-copy-id 192.168.151.151 二、演示…

Linux进程详解

Linux进程详解 1、进程概述1.1并行和并发1.2 PCB1.3 进程状态1.4 进程命令 2、进程创建2.1 函数2.2 fork()解析 3、父子进程3.1 进程执行位置3.2 循环创建子进程3.3 终端显示问题3.4 进程数数 4、execl和execlp4.1 execl()4.2 execlp()4.3 函数的使用 5、进程控制5.1 结束进程5…

Oracle忘记所有密码怎么办

最近遇到一个Oracle的问题,密码要过期了,但是除了用户密码,其他密码都不知道了,修改不了密码怎么办呢? 试了各种方法,最终下面的方式生效了: 首先,使用orapwd生成新的密码文件&…

selenium 工具 的基本使用

公司每天要做工作汇报,汇报使用的网页版, 所以又想起 selenium 这个老朋友了。 再次上手,发现很多接口都变了, 怎么说呢, 应该是易用性更强了, 不过还是得重新看看, 我这里是python3。 pip安装…

有文件实体的后门无文件实体的后门rootkit后门

有文件实体后门和无文件实体后门&RootKit后门 什么是有文件的实体后门: 在传统的webshell当中,后门代码都是可以精确定位到某一个文件上去的,你可以rm删除它,可以鼠标右键操作它,它是有一个文件实体对象存在的。…

熬夜会秃头——beta冲刺Day4

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day4团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 一、团队成员会议总结 1、成员工作进…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了,装一下linux系统玩一下。 使用工具如下:一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…

Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal

目录 摘要引言 Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal CCS 2023 摘要 我们提出了一种基于随机预言机启发式和标准格问题(环/模块SIS/LWE和NTRU)的2轮盲签名协议,签名大小为22KB。该协议是全面优化的&#xf…

如何做接口测试?接口测试工具有哪些?

回想入职测试已经10年时间了,初入职场的我对于接口测试茫然不知。后来因为业务需要,开始慢慢接触接口测试。从最开始使用工具进行接口测试到编写代码实现接口自动化,到最后的测试平台开发。回想这一路走来感触颇深,因此为了避免打…

分享82个节日PPT,总有一款适合您

分享82个节日PPT,总有一款适合您 82个节日PPT下载链接:https://pan.baidu.com/s/1boDTl3PiHFXLJ890CoUfJA?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。…

MathType 7.5.2中文版软件使用期到了怎么办?

MathType 7.5.2中文版作为一款专业的公式编辑器,MathType受到很多人的青睐,它可以将编辑好的公式保存成多种图片格式或透明图片模式,可以很方便的添加或移除符号、表达式等模板(只需要简单地用鼠标拖进拖出即可),也可以…

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注,你也能住大别墅! 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud,为以后做管理后台做准备 3.创建云对象getData,在beforecreate()中获取数据 4.…

详解原生Spring框架下的类切入点表达式与切入点函数

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

126. 单词接龙 II

126. 单词接龙 II 需要注意的是,由于要找最短路径,连接 dot 与 lot 之间的边就不可以被记录下来,同理连接 dog 与 log 之间的边也不可以被记录。这是因为经过它们的边一定不会是最短路径。因此在广度优先遍历的时候,需要记录的图…

分享88个节日PPT,总有一款适合您

分享88个节日PPT,总有一款适合您 88个节日PPT下载链接:https://pan.baidu.com/s/1mfLrdlB9Y1jqz2vkVIwBNA?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令(重要) 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话,我们的echo的…