当前位置: 首页 > news >正文

Python 的Tkinter包系列之七:好例子补充2

Python 的Tkinter包系列之七:好例子补充2

英汉字典(使用文本文件记录英语单词和解释)、简单的通信录(使用SQLite数据库记录人员信息)

一、tkinter编写英汉字典

先看效果图:

词典文件是一个文本文件,我这里起的名字是:CET-4.txt格式如下

每个词占用一行,单词和解释之间用*分割 例如:

a * art.一(个);每一(个)       

abandon * vt.丢弃;放弃,抛弃       

ability * n.能力;能耐,本领       

able * a.有能力的;出色的

baby * n.婴儿;孩子气的人       

back * ad.在后;回原处;回       

background * n.背景,后景,经历

cabinet * n.橱,柜;内阁       

cable * n.缆,索;电缆;电报       

cafe * n.咖啡馆;小餐厅  

为方便,我这里将CET-4.txt和下面的源码文件放到同一个目录(文件夹)中。

源码如下: 

#tkinter编写英汉字典
import tkinter# 读取内容并执行搜索的方法
def search(word):# 读取字典内所有内容file = open("CET-4.txt")  #指定打开文件的编码格式 utf-8dict_list = file.readlines()# 遍历读取的内容,查看用户输入的英文是否存在for dict00 in dict_list:dict_item = dict00.split("*")# 不区分大小写查询,查询到就输出英文和中文;strip()把字符串头和尾的空格去掉if word.upper().strip() == dict_item[0].upper().strip():# 把查询的内容返回并结束循环return "%s: %s" % (dict_item[0], dict_item[1])else:return "您查询的单词尚未收录,敬请期待。。。\n"# 关闭流file.close()def search_word():word = entry.get().strip()if len(word) != 0:# 执行搜索的方法,获取搜索的结果result = search(word)# 把结果插入到文本显示框txt.insert(tkinter.INSERT, result)else:txt.insert(tkinter.INSERT, "内容不能为空\n")# 创建主窗口
window = tkinter.Tk()# 添加标题
window.title("XX字典")# 设置窗口尺寸
window.geometry("400x300")# 内容输入块
frame_input = tkinter.Frame(window, width=300, height=30)
frame_input.place(x=50, y=10)# 输入框
entry = tkinter.Entry(frame_input, width=30)
entry.pack(side="left")# 按钮
btn_in = tkinter.Button(frame_input, text="查询", width=5, command=search_word)
btn_in.pack(side="right", padx=5)# 文本显示块
frame_txt = tkinter.Frame(window, width=350, height=200)
frame_txt.place(x=20, y=40)# 文本显示框的滚动条
scroll_bar = tkinter.Scrollbar(frame_txt)
scroll_bar.pack(side="right", fill=tkinter.Y)# 内容显示框
txt = tkinter.Text(frame_txt, width=50, height=18)
txt.pack(side="bottom", pady=15)# 关联滚动条和文字
txt.config(yscrollcommand=scroll_bar.set)
scroll_bar.config(command=txt.yview)# 显示
window.mainloop()

提示:使用 open() 打开文件时,中文windows系统默认采用 GBK 编码。但当要打开的文件不是 GBK 编码格式时,运行出错,可以指定打开文件的编码格式,例如:

file = open("a.txt",encoding="utf-8")

注意, encoding 参数的值,仅限于文件以文本的形式打开,也就是说,以二进制格式打开时,不能用 encoding 参数。

二、简单的通信录

使用tkinter开发一个带界面的简单的通信录管理系统

先看效果图:

使用SQLite数据库记录人员信息。

SQLite是轻量级、基于文件的数据库管理系统。Python自带Sqlite3数据库。要用Python操作SQLite,不用下载SQLite,只要先import sqlite3后,即可操作SQLite。可参见详见https://blog.csdn.net/cnds123/article/details/106372967

首先使用SQLite工具创建SQLite数据库data.db,然后创建一个数据表addressList,最后在数据表addressList中创建字段id(INTEGER PRIMARY KEY类型)、name(TEXT类型)、sex(TEXT类型)、age(INTEGER类型)、department(TEXT类型)、telephone(TEXT类型)和qq(TEXT类型)。

 下面给出源码

import sqlite3
import tkinter
import tkinter.ttk
import tkinter.messageboxdef doSql(sql):'''用来执行SQL语句,尤其是INSERT和DELETE语句'''    conn = sqlite3.connect('data.db')cur = conn.cursor()cur.execute(sql)conn.commit()conn.close()#创建tkinter应用程序窗口
root = tkinter.Tk()
#设置窗口大小和位置
root.geometry('500x500+400+300')
#不允许改变窗口大小
root.resizable(False, False)
#设置窗口标题
root.title('通信录管理系统')#在窗口上放置标签组件和用于输入姓名的文本框组件
lbName = tkinter.Label(root, text='姓名:')
lbName.place(x=10, y=10, width=40, height=20)
entryName = tkinter.Entry(root)
entryName.place(x=60, y=10, width=150, height=20)#在窗口上放置标签组件和用于选择性别的组合框组件
lbSex = tkinter.Label(root, text='性别:')
lbSex.place(x=220, y=10, width=40, height=20)
comboSex = tkinter.ttk.Combobox(root, values=('男', '女'))
comboSex.place(x=270, y=10, width=150, height=20)#在窗口上放置标签组件和用于输入年龄的文本框组件
lbAge = tkinter.Label(root, text='年龄:')
lbAge.place(x=10, y=50, width=40, height=20)
entryAge = tkinter.Entry(root)
entryAge.place(x=60, y=50, width=150, height=20)#在窗口上放置标签组件和用于输入部门的文本框组件
lbDepartment = tkinter.Label(root, text='部门:')
lbDepartment.place(x=220, y=50, width=40, height=20)
entryDepartment = tkinter.Entry(root)
entryDepartment.place(x=270, y=50, width=150, height=20)#在窗口上放置标签组件和用于输入电话号码的文本框组件
lbTelephone = tkinter.Label(root, text='电话:')
lbTelephone.place(x=10, y=90, width=40, height=20)
entryTelephone = tkinter.Entry(root)
entryTelephone.place(x=60, y=90, width=150, height=20)#在窗口上放置标签组件和用于输入QQ号码的文本框组件
lbQQ = tkinter.Label(root, text='QQ:')
lbQQ.place(x=220, y=90, width=40, height=20)
entryQQ = tkinter.Entry(root)
entryQQ.place(x=270, y=90, width=150, height=20)#在窗口上放置用来显示通信录信息的表格,使用Treeview组件实现
frame = tkinter.Frame(root)
frame.place(x=0, y=180, width=480, height=280)
#滚动条
scrollBar = tkinter.Scrollbar(frame)
scrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
#Treeview组件,分别设置6列的标题和宽度
treeAddressList = tkinter.ttk.Treeview(frame,columns=('c1', 'c2', 'c3','c4', 'c5', 'c6'),show="headings",yscrollcommand = scrollBar.set)
treeAddressList.column('c1', width=70, anchor='center')
treeAddressList.column('c2', width=40, anchor='center')
treeAddressList.column('c3', width=40, anchor='center')
treeAddressList.column('c4', width=120, anchor='center')
treeAddressList.column('c5', width=100, anchor='center')
treeAddressList.column('c6', width=90, anchor='center')
treeAddressList.heading('c1', text='姓名')
treeAddressList.heading('c2', text='性别')
treeAddressList.heading('c3', text='年龄')
treeAddressList.heading('c4', text='部门')
treeAddressList.heading('c5', text='电话')
treeAddressList.heading('c6', text='QQ')
treeAddressList.pack(side=tkinter.LEFT, fill=tkinter.Y)
#Treeview组件与垂直滚动条结合
scrollBar.config(command=treeAddressList.yview)def bindData():'''把数据库里的通信录记录读取出来,然后在表格中显示'''#删除表格中原来的所有行for row in treeAddressList.get_children():treeAddressList.delete(row)#读取数据conn = sqlite3.connect('data.db')cur = conn.cursor()cur.execute('SELECT * FROM addressList ORDER BY id ASC')temp = cur.fetchall()conn.close()#把数据插入表格for i, item in enumerate(temp):treeAddressList.insert('', i, values=item[1:])
#调用函数,把数据库中的记录显示到表格中
bindData()#定义Treeview组件的左键单击事件,并绑定到Treeview组件上
#单击鼠标左键,设置变量nameToDelete的值,然后可以使用“删除”按钮来删除
nameToDelete = tkinter.StringVar()
def treeviewClick(event):if not treeAddressList.selection():returnitem = treeAddressList.selection()[0]nameToDelete.set(treeAddressList.item(item, 'values')[0])
treeAddressList.bind('<Button-1>', treeviewClick)#在窗口上放置用于添加通信录的按钮,并设置按钮单击事件函数
def buttonAddClick():#检查姓名name = entryName.get().strip()if name == '':tkinter.messagebox.showerror(title='很抱歉', message='必须输入姓名')return#姓名不能重复conn = sqlite3.connect('data.db')cur = conn.cursor()cur.execute('SELECT COUNT(id) from addressList where name="' + name + '"')c = cur.fetchone()[0]conn.close()if c!=0:tkinter.messagebox.showerror(title='很抱歉', message='姓名不能重复')return#获取选择的性别sex = comboSex.get()#检查年龄age = entryAge.get().strip()if not age.isdigit():tkinter.messagebox.showerror(title='很抱歉', message='年龄必须为数字')returnif not 1<int(age)<100:tkinter.messagebox.showerror(title='很抱歉',message='年龄必须在1到100之间')return#检查部门department = entryDepartment.get().strip()if department == '':tkinter.messagebox.showerror(title='很抱歉', message='必须输入部门')return#检查电话号码telephone = entryTelephone.get().strip()if telephone=='' or (not telephone.isdigit()):tkinter.messagebox.showerror(title='很抱歉',message='电话号码必须是数字')return#检查QQ号码qq = entryQQ.get().strip()if qq=='' or (not qq.isdigit()):tkinter.messagebox.showerror(title='很抱歉',message='QQ号码必须是数字')return#所有输入都通过检查,插入数据库sql = 'INSERT INTO addressList(name,sex,age,department,telephone,qq) VALUES("'sql += name + '","' + sex + '",' + age + ',"' + department + '","'sql += telephone + '","' + qq + '")'doSql(sql)#添加记录后,更新表格中的数据bindData()
buttonAdd = tkinter.Button(root, text='添加', command=buttonAddClick)
buttonAdd.place(x=120, y=140, width=80, height=20)#在窗口上放置用于删除通信录的按钮,并设置按钮单击事件函数
def buttonDeleteClick():name = nameToDelete.get()if name == '':tkinter.messagebox.showerror(title='很抱歉', message='请选择一条记录')return#如果已经选择了一条通信录,执行SQL语句将其删除sql = 'DELETE FROM addressList where name="' + name + '"'doSql(sql)tkinter.messagebox.showinfo('恭喜', '删除成功')#重新设置变量为空字符串nameToDelete.set('')#更新表格中的数据bindData()
buttonDelete = tkinter.Button(root, text='删除', command=buttonDeleteClick)
buttonDelete.place(x=240, y=140, width=80, height=20)root.mainloop()

相关文章:

Python 的Tkinter包系列之七:好例子补充2

Python 的Tkinter包系列之七&#xff1a;好例子补充2 英汉字典&#xff08;使用文本文件记录英语单词和解释&#xff09;、简单的通信录&#xff08;使用SQLite数据库记录人员信息&#xff09; 一、tkinter编写英汉字典 先看效果图&#xff1a; 词典文件是一个文本文件&…...

每日一练-等差数列

等差数列&#x1f340;题目描述&#x1f33f;解题思路&#x1f338;Python源码&#x1f4e7;Summary&#x1f4c6;Date: 2023年2月10日 &#x1f3ac;Author: 小 y 同 学 &#x1f4c3;Classify: 蓝桥杯每日一练 &#x1f516;Language: Python &#x1f340;题目描述 题意   …...

使用动态参数构建CUDA图

文章目录使用动态参数构建CUDA图使用显式 API 调用构建 CUDA 图使用流捕获构建 CUDA 图组合方法执行结果总结使用动态参数构建CUDA图 自从在 CUDA 10 以来&#xff0c;CUDA Graphs 已被用于各种应用程序。 上图将一组 CUDA 内核和其他 CUDA 操作组合在一起&#xff0c;并使用指…...

在Fortran中调用Python教程

前言Python是机器学习领域不断增长的通用语言。拥有一些非常棒的工具包&#xff0c;比如scikit-learn&#xff0c;tensorflow和pytorch。气候模式通常是使用Fortran实现的。那么我们应该将基于Python的机器学习迁移到Fortran模型中吗&#xff1f;数据科学领域可能会利用HTTP AP…...

04-PS人像磨皮方法

1.高斯模糊磨皮 这种方法的原理就是建立一个将原图高斯模糊后图层, 然后用蒙版加画笔或者历史画笔工具将需要磨皮的地方涂抹出来, 通过图层透明度, 画笔流量等参数来控制磨皮程度 1.新建图层(命名为了高斯模糊磨皮), 混合模式设置为正常, 然后选择高斯模糊, 模糊数值设置到看…...

nginx反向代理+负载均衡上传webshell重难点+apache漏洞

nginx反向代理 nginx 负载均衡 负载均衡的策略 1、轮询&#xff1a;nginx默认就是轮询其权重都默认为1&#xff0c;服务器处理请求的顺序&#xff1a;ABABABABAB… upstream mysvr { server 192.168.137.131; server 192.168.137.136; }2、weight&#xff1a;跟据配置…...

transition组件的使用

<template><button click"flag !flag">切换</button><transition name"fade"><div v-if"flag" class"box"></div></transition> </template><script setup lang"ts"&g…...

多行文本在块元素中垂直居中

单行文本垂直居中对齐 在块元素中&#xff0c;让单行文本居中&#xff0c;可以使用line-height等于块元素的高&#xff0c;即可让该单行文本垂直居中对齐。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…...

在 WebAssembly 中使用 C/C++ 和 libbpf 编写 eBPF 程序

作者&#xff1a;于桐&#xff0c;郑昱笙 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是一种高性能的内核虚拟机&#xff0c;可以运行在内核空间中&#xff0c;用来收集系统和网络信息。随着计算机技术的不断发展&#xff0c;eBPF 的功能日益强大&#xff0c…...

leveldb源码解析六——compact

compact分为manual_compaction、minor_compaction、major_compaction&#xff0c;统一由MaybeScheduleCompaction触发&#xff1a; void DBImpl::MaybeScheduleCompaction() {mutex_.AssertHeld();if (background_compaction_scheduled_) {// Already scheduled} else if (shu…...

数据结构(二):单向链表、双向链表

数据结构&#xff08;二&#xff09;一、什么是链表1.数组的缺点2.链表的优点3.链表的缺点4.链表和数组的区别二、封装单向链表1. append方法&#xff1a;向尾部插入节点2. toString方法&#xff1a;链表元素转字符串3. insert方法&#xff1a;在任意位置插入数据4.get获取某个…...

COCO物体检测评测方法简介

本文从ap计算到map计算&#xff0c;最后到coco[0.5:0.95:0.05] map的计算&#xff0c;一步一步拆解物体检测指标map的计算方式。 一、ap计算方法 一个数据集有多个类别&#xff0c;对于该数据库有5个gt&#xff0c;算法检测出来10个bbox&#xff0c;对于人这个类别来说检测有…...

记一次上环境获取资源失败的案例

代码结构以及资源位置 测试代码 RestController RequestMapping("/json") public class JsonController {GetMapping("/user/1")public String queryUserInfo() throws Exception {// 如果使用全路径, 必须使用/开头String path JsonController.class.ge…...

实战超详细MySQL8离线安装

在RedHat中&#xff0c;RPM Bundle 方式安装MySQL8。建议一定要用 RPM Bndle 版本安装&#xff0c;包全。官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/1.卸载mariadb&#xff0c;会与MySQL安装冲突。rpm -qa | grep mariadb 查看有无mariadb如果有&#xff0…...

依赖倒置原则|SOLID as a rock

文章目录 意图动机:违反依赖倒置原则解决方案:C++中依赖倒置原则的例子依赖倒置原则的优点1、可复用性2、可维护性在C++中用好DIP的标准总结本文是关于 SOLID as Rock 设计原则系列的五部分中的 最后一部分。 SOLID 设计原则侧重于开发 易于维护、可重用和可扩展的软件。 在…...

Webpack的知识要点

在前端开发中&#xff0c;一般情况下都使用 npm 和 webpack。   npm是一个非常流行的包管理工具&#xff0c;帮助开发者管理项目中使用的依赖库和工具。它可以方便地为项目安装第三方库&#xff0c;并在项目开发过程中进行版本控制。   webpack是一个模块打包工具&#xff…...

handler解析(2) -Handler源码解析

目录 基础了解&#xff1a; 相关概念解释 整体流程图&#xff1a; 源码解析 Looper 总结&#xff1a; sendMessage 总结&#xff1a; ThreadLocal 基础了解&#xff1a; Handler是一套 Android 消息传递机制,主要用于线程间通信。实际上handler其实就是主线程在起了一…...

【算法】kmp

KMP算法 名称由来 是由发明这个算法的三个科学家的名称首字母组成 作用 用于字符串的匹配问题 举例说明 字符串 aabaabaaf 模式串 aabaaf 传统匹配方法 第一步 aabaabaaf aabaaf 此时&#xff0c;b和f不一致&#xff0c;则把模式串从头和文本串的第二个字符开始比 第…...

git 常用命令之 git checkout

大家好&#xff0c;我是 17。 git checkout 是 git 中最重要最常用的命令之一&#xff0c;本文为大家详细解说一下。 恢复工作区 checkout 的用途之一是恢复工作区。 git checkout . checkout . 表示恢复工作区的所有更改,未跟踪的文件不会有变化。 恢复工作区的所有文件风…...

一些常见错误

500状态码: 代表服务器业务代码出错, 也就是执行controller里面的某个方法的过程中报错, 此时在IDEA的控制台中会显示具体的错误信息, 所以需要去看IDEA控制台的报错404状态码: 找不到资源找不到静态资源 检查请求地址是否拼写错误 检查静态资源的位置是否正确 如果以上都没有问…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...