首页 > 其他分享 >第一周

第一周

时间:2023-06-25 23:12:52浏览次数:27  
标签:end 第一周 self start tk line textbox

import tkinter as tk
from tkinter import filedialog

class MyTextEditor:
    def __init__(self,master):
        self.master=master
        self.master.title("我的文本编辑器")
        self.master.geometry('900x700')
        self.creat_menu()
        self.create_textbox()

    def creat_menu(self):
        MyMenu=tk.Menu(self.master)
        MyFileMenu=tk.Menu(MyMenu,tearoff=0)#不让子菜单离开菜单栏
        MyEditorMenu=tk.Menu(MyMenu,tearoff=0)


        MyFileMenu.add_command(label='新建一个文件',command=self.My_new_file)#创建子菜单的选项,会调用command后面的函数
        MyFileMenu.add_command(label='打开已有文件',command=self.My_open_file)
        MyFileMenu.add_command(label='保存这个文件',command=self.My_save_file)
        MyFileMenu.add_separator()#增加分隔符
        MyFileMenu.add_command(label='退出这个编辑器',command=self.master.quit)

        MyEditorMenu.add_command(label='查找指定内容',command=self.My_find)
        MyEditorMenu.add_command(label='替换指定内容',command=self.replace)
        MyEditorMenu.add_separator()
        MyEditorMenu.add_command(label='插入文本块',command=self.insert_textblock)
        MyEditorMenu.add_command(label='插入文本串',command=self.insert_text)
        MyEditorMenu.add_separator()
        MyEditorMenu.add_command(label='删除内容',command=self.delete)
        MyEditorMenu.add_separator()
        MyEditorMenu.add_command(label='移动行块',command=self.move_lineblock)
        MyEditorMenu.add_command(label='移动列块',command=self.move_columnblock)


        MyMenu.add_cascade(label='文件操作',menu=MyFileMenu)
        MyMenu.add_cascade(label='文本操作',menu=MyEditorMenu)
        self.master.config(menu=MyMenu)

    # #创建文本框
    # def create_textbox(self):
    #     My_scrollbar=tk.Scrollbar(self.master)
    #     My_scrollbar.pack(side=tk.RIGHT,fill=tk.Y)#创建滚动条,将位置放在窗口右侧,滚动方向为Y轴(垂直)方向
    #     self.textbox=tk.Text(self.master,wrap=tk.WORD,yscrollcommand=My_scrollbar.set)#以单词为为分割符
    #     self.textbox.pack(fill=tk.BOTH, expand=1)
    #     My_scrollbar.config(command=self.textbox.yview)#将滑动绑定文本内容
    def create_textbox(self):
        textbox_frame = tk.Frame(self.master)
        textbox_frame.pack(fill=tk.BOTH, expand=1)

        scrollbar = tk.Scrollbar(textbox_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.textbox = tk.Text(textbox_frame, wrap=tk.WORD, yscrollcommand=scrollbar.set)
        self.textbox.pack(fill=tk.BOTH, expand=1)

        self.line_numbers = tk.Text(textbox_frame, width=5, state=tk.DISABLED)
        self.line_numbers.pack(side=tk.LEFT, fill=tk.Y)

        scrollbar.config(command=self.textbox.yview)

        self.textbox.bind("<<Modified>>", self.update_line_numbers)
        self.textbox.bind("<KeyRelease>", self.update_line_numbers)  # 绑定 KeyRelease 事件
        self.update_line_numbers()

    def update_line_numbers(self, event=None):
        content = self.textbox.get("1.0", tk.END)
        line_count = content.count("\n") + 1
        line_numbers_text = "\n".join(str(i) for i in range(1, line_count + 1))

        self.line_numbers.config(state=tk.NORMAL)
        self.line_numbers.delete("1.0", tk.END)
        self.line_numbers.insert(tk.END, line_numbers_text)
        self.line_numbers.config(state=tk.DISABLED)
#
#文件操作函数
#
    def My_new_file(self):
        self.textbox.delete('1.0', tk.END)#从最后一个删到第一个

    def My_open_file(self):
        filepath = filedialog.askopenfilename()#打开文件
        #将文件全都存到data中,然后将这些都删除,再插入数据
        with open(filepath, 'r') as f:
            data = f.read()
        self.textbox.delete('1.0', tk.END)
        self.textbox.insert(tk.END, data)

    def My_save_file(self):
        #调用函数保存函数,默认保存为txt文件
        filepath = filedialog.asksaveasfilename(defaultextension='.txt')
        data = self.textbox.get('1.0', tk.END)
        with open(filepath, 'w') as f:
            f.write(data)
#
#文本操作函数
#
    #查找内容
    def My_find(self):
        NeedWord=tk.simpledialog.askstring('查找', '请输入要查找的内容')
        #从最开始找,找到后贴上found标签,将start和end交换,继续往后找
        if NeedWord:
            start = '1.0'
            while True:
                start = self.textbox.search(NeedWord, start, tk.END)
                if not start:
                    break
                end = '{}+{}c'.format(start, len(NeedWord))
                self.textbox.tag_add('found', start, end)
                start = end
            self.textbox.tag_config('found', foreground='white', background='blue')
# 替换
    def replace(self):
        target = tk.simpledialog.askstring('替换', '请输入要替换的内容')
        need = tk.simpledialog.askstring('替换', '请输入替换的内容')
        if target:
            start = '1.0'
            while True:
                start = self.textbox.search(target, start, tk.END)
                if not start:
                    break
                end = '{}+{}c'.format(start, len(target))
                self.textbox.tag_add('found', start, end)
                start = end
            found_range = '1.0'
            while True:
                found_range = self.textbox.tag_nextrange('found', found_range)
                if not found_range:
                    break
                replace_str = need
                self.textbox.delete(found_range[0], found_range[1])
                self.textbox.insert(found_range[0], replace_str)
            if self.textbox.tag_ranges('found'):
                self.textbox.tag_remove('found', '1.0', tk.END)
            else:
                tk.messagebox.showinfo('未找到匹配项', '未找到任何匹配的内容')

    # 插入文本块
    def insert_textblock(self):
        # 可以获取到一个包含选中文本起始位置和结束位置的元组将起始位置和结束位置分别赋值给 start 和 end 变量。
        start, end = self.textbox.tag_ranges(tk.SEL)
        if start and end:
            data = self.textbox.get(start, end)
            self.textbox.delete(start, end)
            self.textbox.mark_set(tk.INSERT, start)#将插入光标的位置设置为 start
            self.textbox.insert(tk.INSERT, data)#在光标处插入数据

        # 插入文本串
    def insert_text(self):
        data = tk.simpledialog.askstring('插入文本', '请输入要插入的内容')
        if data:
            self.textbox.insert(tk.INSERT, data)
# 删除
    def delete(self):
        start, end = self.textbox.tag_ranges(tk.SEL)
        if start and end:
            self.textbox.delete(start, end)
# 移动行块
    def move_lineblock(self):
        start, end = self.textbox.tag_ranges(tk.SEL)
        if start and end:
            data = self.textbox.get(start, end)
            self.textbox.delete(start, end)
            insert_index = self.get_insert_index()
            self.textbox.mark_set(tk.INSERT, insert_index)
            self.textbox.insert(insert_index, data)
 # 移动列块
    def move_columnblock(self):
        selected_ranges = self.textbox.tag_ranges(tk.SEL)
        if len(selected_ranges) % 2 != 0:
            tk.messagebox.showinfo('无效的选择', '无法移动列块:请选择完整的文本行')
            return

        for i in range(0, len(selected_ranges), 2):
            start = selected_ranges[i]
            end = selected_ranges[i + 1]

            start_line, start_col = map(int, start.split('.'))
            end_line, end_col = map(int, end.split('.'))
            data = ''

            for line in range(start_line, end_line + 1):
                line_data = self.textbox.get('{}.{}'.format(line, start_col), '{}.{}'.format(line, end_col))
                data += line_data + '\n'

            self.textbox.delete(start, end)
            insert_index = self.get_insert_index()
            self.textbox.mark_set(tk.INSERT, insert_index)
            self.textbox.insert(insert_index, data)

    # 获取插入点位置
    def get_insert_index(self):
        insert_line, insert_col = map(int, self.textbox.index(tk.INSERT).split('.'))
        total_lines = int(self.textbox.index(tk.END).split('.')[0])
        if insert_line == total_lines:
            return '{}.{}'.format(insert_line + 1, 0)
        else:
            return '{}.{}'.format(insert_line, 0)
root=tk.Tk()
app=MyTextEditor(root)
root.mainloop()

 

标签:end,第一周,self,start,tk,line,textbox
From: https://www.cnblogs.com/wllovelmbforever/p/17504205.html

相关文章

  • 大二暑假第一周总结
    这一周是数据结构的小学期,学了最小生成树的Prim算法,矩阵运算,链式基数排序等算法。第二阶段设计了渡船管理模拟系统,是用Python语言写的。Python语言强大且方便,有很多库和函数的功能都是意想不到的好用。课程设计工作日报表时间:2023年  6月16日序号工作分类工作......
  • 暑期第一周总结
    这周完成了对Linux系统的学习,安装了vm虚拟机,配置了4个centos虚拟机,完成了虚拟机之间的免密登录等到一系列的操作,虚拟机配置了java环境,hadoop环境,创建了三台服务器,并且针对虚拟机和服务器都实现了ssh连接,对ssh连接的服务器进行了很多一系列的配置,创建了hadoophdfs集群总之,很麻烦,......
  • 第一周周记
    周一下午的高铁回家结果没有赶上,只能买了晚上九点的火车无座票,花60在餐车呆了一晚上,周二中午十一点到家,睡了一天。周三在网上购买了Java教程准备完成Java自学任务,周四周五都呆在家里面,周六书到了准备开始自学java......
  • 大二暑假第一周总结
    这周就开始了小学期,这周的小学期的是算法与数据结构综合训练,总共是分为两个阶段,第一阶段是基础算法训练,第二阶段是综合算法训练。第一阶段是基础算法演示,验收的时候非常顺利,同时参与了评优,成功评上。第二阶段我选的是导师双选系统,并且也在周五就已经完成,然后后面就是测试自己的......
  • 第一周
    周一:理发,中午开会,下午在哔哩哔哩上找了一个网课,跟着网课下载了JDK,但是设置的时候一直没找到jre文件,明天打算找到jre文件再设置一下。周二:去驾校报名,去地里摘李子,在抖音上找jre文件没有的解决视频,视频里的生成jre文件的命令报错,最后发现bin文件里的内容和视频里不一样,在别的文件......
  • 第一周
    6.19日: 一、打扫房间,收拾厨房,回家先营造良好的学习环境。二、配置好了idea的编译环境,并将其激活,并了解一下内容 JDK、JRE、JVM的关系:JDK:JavaDevelopmentKit,Java开发工具包JRE:JavaRuntimeEnvironment,Java运行环境JVM:JavaVirtualMachine,Java虚拟机JDK包含JRE,JRE包含J......
  • 欧洲杯第一周的比赛闲聊
    欧洲杯开赛的第一周,精彩纷呈的同时,有点五味杂陈,有竞技层面的,有人性的考验,好戏才刚刚开始。对球员和球迷来说这届的欧洲杯来之不易,来到现场的球迷,更是不容易,从某种层面,参赛的球队、球员、球迷都是赢家,虽然某些球场,按照防疫要求,不能装满球迷,但无论是现场,还是电视机前,所有的球迷,都在为......
  • 暑期第一周总结
    (1)本周做了什么,花在学习上多长时间,花在代码时间上多长时间,花在解决问题用了多长时间。本周我主要集中在学习Web后端开发中的关键框架,包括SpringBoot、MyBatis和PageHelper,以及Lombok库的使用。下面是我对本周学习内容的总结和收获:SpringBoot:本周我深入学习了SpringBoot框架,它......
  • 深度学习用于疾病预后-第二课第一周第4-7节 医学预后案例欣赏+作业解析
    第二课第一周第4-7节医学预后案例欣赏+作业解析视频地址:B>Tina-姐预后的案例在这节课中,我们将看看预后临床例子。看看预后任务的输入和输出是什么样子的,以及我们如何权衡输入之间的权重。我们可以把预后模型看作一个系统,它把病人的资料(profile)作为输入,并输出病人的风险评分。pro......
  • 第一周总结
    本周为软件工程开课第一周,学习mvc框架做信息征集系统,收获很大某个文本文件中存储了60W条记录,以\r\n作为分隔符,现在需要从文本中一次性取出所有值并存放到一个string[]数组中。StreamReadersr=newStreamReader(strFilePath,System.Text.UnicodeEncoding.GetEncoding("utf-......