本篇为视频课程

tkinter从入门到实战视频​blog.csdn.net

章节文档,请结合教程学习

4.1 自制编辑器

项目实战要点

在之前章节中已经学习了tkinter的大量知识,但仍然有部分知识是没有覆盖到的,换句话说,本教程并不是一本事无巨细的帮助文档,未提到的知识,我将在项目实战中列出,根据具体使用场景来学习。

  • 覆写窗口关闭事件
self.protocol('WM_DELETE_WINDOW', self.exit_editor)

  • 实现鼠标右键菜单
def _create_right_popup_menu(self):popup_menu = Menu(self.content_text, tearoff=0)for it1, it2 in zip(['剪切', '复制', '粘贴', '撤销', '恢复'],['cut', 'copy', 'paste', 'undo', 'redo']):popup_menu.add_command(label=it1, compound='left',command=self._shortcut_action(it2))popup_menu.add_separator()popup_menu.add_command(label='全选', command=self.select_all)self.content_text.bind('<Button-3>',lambda event:popup_menu.tk_popup(event.x_root, event.y_root))

  • 使用闭包处理回调事件
def _shortcut_action(self, type):def handle():if type == "new_file":self.new_file()elif type == "open_file":self.open_file()elif type == "save":self.save()elif type == "cut":# ………… 省略部分条件判断if type != "copy" and type != "save":self._update_line_num()return handle

  • 使用tkinter中的定时回调
self.content_text.after(200, self._toggle_highlight)

  • 实现文本搜索功能
start_pos = self.content_text.search(key, start_pos, nocase=ignore_case, stopindex="end")

遗留待完善问题

  • 处理文本文件编码

自制的编辑器目前无法打开不同编码格式的文本文件,需要能自动识别文本文件的编码

建议考虑使用chardet 模块来识别编码

import chardetwith open('xxx.py', 'rb') as file:print(chardet.detect(file.read(1024)))

  • 搜索框定位

搜索框应当根据当前编辑器的相对位置来显示

# 获取根窗口的绝对位置,依据根窗口的位置计算搜索框的显示位置print(self.winfo_rootx(), self.winfo_rooty())

  • 使用自定义的选项卡控件重构编辑器

我们之前已经自定义了一个选项卡控件,实现了双创建选项卡,删除选项卡等功能,使用该控件重构编辑器,使编辑器更加实用

搭建 UI 框架

from tkinter import *
from tkinter.ttk import Scrollbartheme_color = {'Default': '#000000.#FFFFFF','Greygarious': '#83406A.#D1D4D1','Aquamarine': '#5B8340.#D1E7E0','Bold Beige': '#4B4620.#FFF0E1','Cobalt Blue': '#ffffBB.#3333aa','Olive Green': '#D1E7E0.#5B8340','Night Mode': '#FFFFFF.#000000',
}class EditorPlus(Tk):def __init__(self):super().__init__()self._set_window_()self._create_menu_bar_()self._create_shortcut_bar_()self._create_body_()# 设置初始窗口的属性def _set_window_(self):self.title("EditorPlus")self.geometry('650x450')# 创建整个菜单栏def _create_menu_bar_(self):menu_bar = Menu(self)# 创建文件的联级菜单file_menu = Menu(menu_bar, tearoff=0)file_menu.add_command(label='新建', accelerator='Ctrl+N')file_menu.add_command(label='打开', accelerator='Ctrl+O')file_menu.add_command(label='保存', accelerator='Ctrl+S')file_menu.add_command(label='另存为', accelerator='Shift+Ctrl+S')file_menu.add_separator()file_menu.add_command(label='退出', accelerator='Alt+F4')# 在菜单栏上添加菜单标签,并将该标签与相应的联级菜单关联起来menu_bar.add_cascade(label='文件', menu=file_menu)# 创建编辑的联级菜单edit_menu = Menu(menu_bar, tearoff=0)edit_menu.add_command(label='撤销', accelerator='Ctrl+Z')edit_menu.add_command(label='恢复', accelerator='Ctrl+Y')edit_menu.add_separator()edit_menu.add_command(label='剪切', accelerator='Ctrl+X')edit_menu.add_command(label='复制', accelerator='Ctrl+C')edit_menu.add_command(label='粘贴', accelerator='Ctrl+V')edit_menu.add_separator()edit_menu.add_command(label='查找', accelerator='Ctrl+F')edit_menu.add_separator()edit_menu.add_command(label='全选', accelerator='Ctrl+A')menu_bar.add_cascade(label='编辑', menu=edit_menu)# 视图菜单view_menu = Menu(menu_bar, tearoff=0)show_line_number = IntVar()show_line_number.set(1)view_menu.add_checkbutton(label='显示行号', variable=show_line_number)highlight_line = IntVar()view_menu.add_checkbutton(label='高亮当前行', onvalue=1, offvalue=0, variable=highlight_line)# 在主题菜单中再添加一个子菜单列表themes_menu = Menu(menu_bar, tearoff=0)view_menu.add_cascade(label='主题', menu=themes_menu)theme_choice = StringVar()theme_choice.set('Default')for k in sorted(theme_color):themes_menu.add_radiobutton(label=k, variable=theme_choice)menu_bar.add_cascade(label='视图', menu=view_menu)about_menu = Menu(menu_bar, tearoff=0)about_menu.add_command(label='关于')about_menu.add_command(label='帮助')menu_bar.add_cascade(label='关于', menu=about_menu)self["menu"] = menu_bar# 创建快捷菜单栏def _create_shortcut_bar_(self):shortcut_bar = Frame(self, height=25, background='#20b2aa')shortcut_bar.pack(fill='x')# 创建程序主体def _create_body_(self):# 创建行号栏 (takefocus=0 屏蔽焦点)line_number_bar = Text(self, width=4, padx=3, takefocus=0, border=0,background='#F0E68C', state='disabled')line_number_bar.pack(side='left', fill='y')# 创建文本输入框content_text = Text(self, wrap='word')content_text.pack(expand='yes', fill='both')# 创建滚动条scroll_bar = Scrollbar(content_text)scroll_bar["command"] = content_text.yviewcontent_text["yscrollcommand"] = scroll_bar.setscroll_bar.pack(side='right', fill='y')if "__main__" == __name__:app = EditorPlus()app.mainloop()

完善编辑器的功能

实现了基本的界面框架之后,只需将相应的功能一个一个添加上去即可。

arcticfox1919/tkinter-practice​github.com

关注我的公众号:编程之路从0到1

tkinter 中给某个文本加上滚动条_Python Tkinter自制文本编辑器相关推荐

  1. python 文本分析库_Python有趣|中文文本情感分析

    前言 前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下: 数据情况和处理 数据情况 这里的数据为大众点评上的评论数 ...

  2. python在文本添加超链接_Python将超链接文本打印到Spyder控制台(Python print hyperlinked text to Spyder Console)...

    Python将超链接文本打印到Spyder控制台(Python print hyperlinked text to Spyder Console) 我在Windows 7上使用WinPython发行版 ...

  3. python 文本相似度_python实现的文本相似度算法(余弦定理)

    只对汉字进行相似度分析,以单个字为向量,然后每个字在章节中出现的次数,便是以此字向量的值.现在我们假设: 章节1中出现的字为:Z1c1,Z1c2,Z1c3,Z1c4--Z1cn:它们在章节中的个数为: ...

  4. python文本去重复_python多个文本组合后去除重复项

    有三个txt文件:a.txt.b.txt.c.txta.txt有4行数据以"\n"分隔行,即:北京天津南京上海b.txt有2行数据以"\n"分隔行,即:北京西安 ...

  5. python为text添加滚动条_Python GUI编程(Tkinter)7、带滚动条的Text

    import tkinter #创建主窗口 win = tkinter.Tk() #设置标题 win.title("sunck") #设置大小和位置 #win.geometry(& ...

  6. tkinter中分割线Separator、frame控件pack_propagate(0)、frame滚动条的用法

    1.设置屏幕最大化方法: #设置窗口最大化: #方法一 root = Tk() w, h = root.maxsize() root.geometry("{}x{}".format ...

  7. python为text添加滚动条_在Tkinter中向一组小部件添加滚动条

    概述 您只能将滚动条与一些小部件关联起来,根小部件和Frame不是那组小部件的一部分. 最常见的解决方案是创建一个画布小部件,并将滚动条与该小部件关联起来.然后,将包含标签小部件的框架嵌入到画布中.确 ...

  8. python输出文本框_python TKinter获取文本框内容的方法

    python TKinter获取文本框内容的方法 如下所示: #coding:utf-8 import urllib,urllib2 import Tkinter #导入TKinter模块 ytm=T ...

  9. python label显示图片_python 实现在tkinter中动态显示label图片的方法

    在编程中我们往往会希望能够实现这样的操作:点击Button,选择了图片,然后在窗口中的Label处显示选到的图片.那么这时候就需要如下代码: from tkinter import * from tk ...

最新文章

  1. CNN网络优化加速汇总
  2. 机器学习算法基础概念学习总结
  3. WPF: 结束程序及关闭所有窗口
  4. AngularJS中的表单验证机制
  5. Python eval 函数
  6. Xcode6在10.9.4上面crash解决
  7. L298N 电机驱动板 - 详细介绍
  8. git 密钥文件在哪里? 代码提交到Git分支。
  9. mysql忘记密码怎样重置
  10. 计算机开机数字键盘解锁,数字键盘怎么解锁
  11. 数据分析面试【统计学】-----假设检验知识点归纳
  12. Mp3加3d 环绕声
  13. 游戏程序常规设计模式
  14. 神经元树突、早期、突触及神经元标志物
  15. bzoj-1135 Lyz
  16. java 余弦定理_Java根据余弦定理计算文本相似度
  17. datatable隐藏列设置及获取隐藏列的值
  18. win10安装cuda10.2+tensorflow-GPU 1.14.0
  19. 家电空调手机行业序列号追溯溯源管理,汉码PDA扫码入库出库
  20. java万年历方法_利用java制作万年历

热门文章

  1. android自动化必备之界面元素
  2. MD1——2 Corner
  3. FFmpeg安装(windows环境)
  4. MongoDB数据库和集合的基本操作
  5. 【Anaconda】Anaconda 环境操作(新建/激活/退出/删除/克隆/重命名)
  6. 【数据结构】递归代码模板
  7. 2021大同高考成绩查询,大同高考分数查询(查询方法+入口)
  8. java scanner类成员_Java Scanner类的使用示例
  9. Wireshake抓包数据怎么看(一)
  10. C++关键字 friend