Menu创建记事本简单示例

目的

  • 熟悉Menu的使用方法,创建简单的记事本示例

代码

import tkinter as tk


class APPlication(object):
    def __init__(self, master):
        self.master = master
        self.textpad = None
        self.createwidget()

    def createwidget(self):
        """创建主菜单栏"""
        menubar = tk.Menu(self.master)

        """创建子菜单栏"""
        menuFile = tk.Menu(menubar, tearoff=0)      # tearoff = False表示取消虚线 ,默认等于 True ,同样可用使用 1 或 0 表示
        menuEdit = tk.Menu(menubar, tearoff=False)
        menuHelp = tk.Menu(menubar, tearoff=0)

        """在子菜单中添加菜单项"""
        for item in ('新建', '打开', '保存', '另存为', '退出'):
            if item == '退出':
                menuFile.add_separator()          # add_separator() 表示添加一条分割线 ,默认不添加
                menuFile.add_command(label=item)
            else:
                menuFile.add_command(label=item)

        for item in ('复制', '粘贴', '剪切', '格式化'):
            menuEdit.add_command(label=item)

        for item in ('查看帮助', '发送反馈', '关于记事本'):
            if item == '关于记事本':
                menuHelp.add_separator()
                menuHelp.add_command(label=item)
            else:
                menuHelp.add_command(label=item)

        """在主菜单栏添加菜单,并关联子菜单项"""
        menubar.add_cascade(label='文件', menu=menuFile)
        menubar.add_cascade(label='编辑', menu=menuEdit)
        menubar.add_cascade(label='帮助', menu=menuHelp)

        """将主菜单栏放置到跟窗口"""
        self.master['menu'] = menubar

        """创建文本编辑区"""
        self.textpad = tk.Text(self.master, width=10, height=10)


if __name__ == '__main__':
    root = tk.Tk()
    root.title('简易记事本')
    root.geometry('500x400+400+200')
    root.resizable(width=0, height=0)
    APP = APPlication(root)
    root.mainloop()

结果展示

在原基础上添加右键选项菜单

  • 代码
import tkinter as tk


class APPlication(object):
    def __init__(self, master):
        self.master = master
        self.textpad = None
        self.createwidget()

    def createwidget(self):
        """创建主菜单栏"""
        menubar = tk.Menu(self.master)

        """创建子菜单栏"""
        menuFile = tk.Menu(menubar, tearoff=False)
        menuEdit = tk.Menu(menubar, tearoff=False)
        menuHelp = tk.Menu(menubar, tearoff=False)

        """在子菜单中添加菜单项"""
        for item in ('新建', '打开', '保存', '另存为', '退出'):
            if item == '退出':
                menuFile.add_separator()
                menuFile.add_command(label=item)
            else:
                menuFile.add_command(label=item)

        for item in ('复制', '粘贴', '剪切', '格式化'):
            menuEdit.add_command(label=item)

        for item in ('查看帮助', '发送反馈', '关于记事本'):
            if item == '关于记事本':
                menuHelp.add_separator()
                menuHelp.add_command(label=item)
            else:
                menuHelp.add_command(label=item)

        """在主菜单栏添加菜单,并关联子菜单项"""
        menubar.add_cascade(label='文件', menu=menuFile)
        menubar.add_cascade(label='编辑', menu=menuEdit)
        menubar.add_cascade(label='帮助', menu=menuHelp)

        """将主菜单栏放置到跟窗口"""
        self.master['menu'] = menubar

        """创建文本编辑区"""
        self.textpad = tk.Text(self.master, width=10, height=10)

        """添加右键菜单"""
        self.textmenu = tk.Menu(self.master, tearoff=False)
        for item in ('选择', '取消', '删除', '撤回'):
            self.textmenu.add_command(label=item)

        """为右键绑定事件"""
        self.master.bind('<3>', self.rightbtn)    # <3> 代表鼠标右键 或者使用 <Button-3> 和 <ButtonPress-3>

    def rightbtn(self, event):
        self.textmenu.post(event.x_root, event.y_root)      #x_root 和 y_root 是相对于父容器的坐标 ,post 方法是获取右键单击的坐标


if __name__ == '__main__':
    root = tk.Tk()
    root.title('简易记事本')
    root.geometry('500x400+400+200')
    root.resizable(width=0, height=0)
    APP = APPlication(root)
    root.mainloop()

演示示例

再在以上基础之上,添加键盘快捷键处理

  • 代码
import tkinter as tk
import tkinter.filedialog


class APPlication(object):
    def __init__(self, master):
        self.master = master
        self.textpad = None
        self.textmenu = None
        self.createwidget()

    def createwidget(self):
        """创建主菜单栏"""
        menubar = tk.Menu(self.master)

        """创建子菜单栏"""
        menuFile = tk.Menu(menubar, tearoff=False)
        menuEdit = tk.Menu(menubar, tearoff=False)
        menuHelp = tk.Menu(menubar, tearoff=False)

        """在子菜单中添加菜单项"""
        for item in ('新建', '打开', '保存', '另存为', '退出'):
            if item == '退出':
                menuFile.add_separator()
                menuFile.add_command(label=item, command=self.Exit)
            elif item == '打开':
                menuFile.add_command(label=item, command=self.OpenFile, accelerator='CTRL+O')
            elif item == '保存':
                menuFile.add_command(label=item, command=self.SaveFile, accelerator='CTRL+S')
            elif item == '新建':
                menuFile.add_command(label=item, command=self.NewFile, accelerator='CTRL+N')
            elif item == '另存为':
                menuFile.add_command(label=item, accelerator='CTRL+ALT+S')
            else:
                menuFile.add_command(label=item)

        for item in ('复制', '粘贴', '剪切', '格式化'):
            menuEdit.add_command(label=item)

        for item in ('查看帮助', '发送反馈', '关于记事本'):
            if item == '关于记事本':
                menuHelp.add_separator()
                menuHelp.add_command(label=item)
            else:
                menuHelp.add_command(label=item)

        """在主菜单栏添加菜单,并关联子菜单项"""
        menubar.add_cascade(label='文件', menu=menuFile)
        menubar.add_cascade(label='编辑', menu=menuEdit)
        menubar.add_cascade(label='帮助', menu=menuHelp)

        """将主菜单栏放置到跟窗口"""
        self.master['menu'] = menubar

        """创建文本编辑区"""
        self.textpad = tk.Text(self.master, height=30)
        self.textpad.pack(pady=2.2)

        """添加右键菜单"""
        self.textmenu = tk.Menu(self.master, tearoff=False)
        for item in ('打开', '另存为', '背景颜色'):
            self.textmenu.add_command(label=item)

        """为右键绑定事件"""
        self.master.bind('<ButtonPress-3>', self.rightbtn)

        """增加快捷键的处理"""
        self.master.bind('<Control-n>', lambda event: self.NewFile())      # 使用匿名函数绑定处理方法,从而触发快捷键响应
        self.master.bind('<Control-s>', lambda event: self.SaveFile())
        self.master.bind('<Control-o>', lambda event: self.OpenFile())

    """创建右键事件"""

    def rightbtn(self, event):
        self.textmenu.post(event.x_root, event.y_root)

    def NewFile(self):
        self.newfile = tkinter.filedialog.asksaveasfile(title='保存', initialfile='新建文件.txt', defaultextension='.txt',
                                                        filetypes=[('文本文件', '*.txt')])
        self.SaveFile()

    def OpenFile(self):
        self.textpad.delete(1.0, 'end')  # 清空所有内容
        with tkinter.filedialog.askopenfile(title='打开文本文件', filetypes=[('文本文件', '*.txt')]) as openfile:
            self.textpad.insert('insert', openfile.read())  # insert 表示从光标所在位置插入字符串
            self.filename = openfile.name

    def SaveFile(self):
        with open(self.filename, 'w') as savefile:
            """end 表示从字符串的最后添加(无论光标在什么位置); 1.0 表示从第1行,第0列开始获取1(行从1开始,列从0开始)"""
            textpad_content = self.textpad.get(1.0, 'end')
            savefile.write(textpad_content)

    def Exit(self):
        self.master.quit()


if __name__ == '__main__':
    root = tk.Tk()
    root.title('简易记事本')
    root.geometry('500x400+400+200')
    root.resizable(width=0, height=0)
    APP = APPlication(root)
    root.mainloop()

结果演示

posted @ 2021-04-18 13:40  廿九九  阅读(120)  评论(0)    收藏  举报