Python用tkinter實(shí)現(xiàn)自定義記事本的方法詳解
一、思考
想要完成記事本,我們首先需要考慮一個(gè)正常的記事本都需要具有哪些功能,我們將這些功能按鍵添加到我們的UI界面上即可。一般功能如下:
- 新建文本文檔
- 打開本地文件
- 保存文本文檔
- 功能項(xiàng):剪切、復(fù)制、粘貼等
設(shè)定好了基本的功能選項(xiàng)之后我們?cè)賮硭伎紝?shí)現(xiàn)記事本的思路。
- 創(chuàng)建記事本窗口
- 設(shè)定記事本菜單項(xiàng)
- 給不同的菜單項(xiàng)配置不同的功能選項(xiàng)
- 運(yùn)行筆記本
二、代碼實(shí)現(xiàn)
創(chuàng)建記事本窗口
創(chuàng)建窗口的時(shí)候,我們要設(shè)定好窗口的高度、寬度、文本區(qū)域以及各種菜單,與設(shè)定的內(nèi)容如下:
class Notepad: root = Tk() ''' Width:寬度 Heith:高度 TextArea:文本區(qū)域 MenuBar:菜單欄 FileMenu:文件菜單 EditMenu:編輯菜單 HelpMenu:幫助菜單 ScrollBat:滾動(dòng)條 ''' Width = 300 Height = 300 TextArea = Text(root) MenuBar = Menu(root) FileMenu = Menu(MenuBar, tearoff=0) EditMenu = Menu(MenuBar, tearoff=0) HelpMenu = Menu(MenuBar, tearoff=0) ScrollBar = Scrollbar(TextArea) file = None
設(shè)定記事本菜單項(xiàng)
設(shè)定好了基本的框架之后,接下來就是向整個(gè)框架中填入各種參數(shù)與配置項(xiàng),包括菜單欄中各種功能選項(xiàng)、窗口標(biāo)題、窗口位置等。
后續(xù)如果向添加新的功能在init函數(shù)中進(jìn)行添加即可
菜單項(xiàng)代碼示例:
def __init__(self, **kwargs): # 增加新建配置 self.FileMenu.add_command(label="新建", command=self.__newFile) # 增加打開配置 self.FileMenu.add_command(label="打開", command=self.__openFile) # 增加保存配置 self.FileMenu.add_command(label="保存", command=self.__saveFile)
配置功能選項(xiàng)
接下來就是構(gòu)建不同的功能函數(shù),實(shí)現(xiàn)每一個(gè)小功能,這里不需要我們編寫?yīng)毩⒌墓δ芎瘮?shù)代碼,只需要使用tkinter中的函數(shù)進(jìn)行再封裝即可。
配置功能示例代碼:
def __newFile(self): ''' 新文件:默認(rèn)是一個(gè)未命名文件 ''' self.root.title("未命名文件") self.file = None self.TextArea.delete(1.0, END)
完整代碼如下
import tkinter import os from tkinter import * from tkinter.messagebox import * from tkinter.filedialog import * class Notepad: root = Tk() ''' Width:寬度 Heith:高度 TextArea:文本區(qū)域 MenuBar:菜單欄 FileMenu:文件菜單 EditMenu:編輯菜單 HelpMenu:幫助菜單 ScrollBat:滾動(dòng)條 ''' Width = 300 Height = 300 TextArea = Text(root) MenuBar = Menu(root) FileMenu = Menu(MenuBar, tearoff=0) EditMenu = Menu(MenuBar, tearoff=0) HelpMenu = Menu(MenuBar, tearoff=0) ScrollBar = Scrollbar(TextArea) file = None def __init__(self, **kwargs): # 設(shè)置文本框的大小 try: self.Width = kwargs['width'] except KeyError: pass try: self.Height = kwargs['height'] except KeyError: pass # 設(shè)置窗口標(biāo)題 self.root.title("Python記事本") # 將窗口居中顯示 screenWidth = self.root.winfo_screenwidth() screenHeight = self.root.winfo_screenheight() left = (screenWidth / 2) - (self.Width / 2) top = (screenHeight / 2) - (self.Height / 2) self.root.geometry('%dx%d+%d+%d' % (self.Width, self.Height, left, top)) # 文本區(qū)域大小調(diào)整 self.root.grid_rowconfigure(0, weight=1) self.root.grid_columnconfigure(0, weight=1) # Add controls (widget) self.TextArea.grid(sticky=N + E + S + W) # 增加新建配置 self.FileMenu.add_command(label="新建", command=self.__newFile) # 增加打開配置 self.FileMenu.add_command(label="打開", command=self.__openFile) # 增加保存配置 self.FileMenu.add_command(label="保存", command=self.__saveFile) # 增加退出配置 self.FileMenu.add_separator() self.FileMenu.add_command(label="退出", command=self.__quitApplication) # 菜單中設(shè)置文件按鈕 self.MenuBar.add_cascade(label="文件", menu=self.FileMenu) # 增加剪切功能 self.EditMenu.add_command(label="剪切", command=self.__cut) # 增加復(fù)制功能 self.EditMenu.add_command(label="復(fù)制", command=self.__copy) # 增加粘貼功能 self.EditMenu.add_command(label="粘貼", command=self.__paste) # 菜單中設(shè)置編輯按鈕 self.MenuBar.add_cascade(label="編輯", menu=self.EditMenu) # 增加關(guān)于記事本選項(xiàng) self.HelpMenu.add_command(label="關(guān)于記事本", command=self.__showAbout) # 菜單中射者幫助按鈕 self.MenuBar.add_cascade(label="幫助", menu=self.HelpMenu) self.root.config(menu=self.MenuBar) self.ScrollBar.pack(side=RIGHT, fill=Y) # 滾動(dòng)條根據(jù)內(nèi)容進(jìn)行調(diào)整 self.ScrollBar.config(command=self.TextArea.yview) self.TextArea.config(yscrollcommand=self.ScrollBar.set) def __quitApplication(self): ''' 用于退出程序(關(guān)了就消失) ''' self.root.destroy() def __showAbout(self): ''' 添加幫助菜單中的信息 ''' showinfo("關(guān)于記事本", "來自:二哥不像程序員") def __openFile(self): ''' 打開文件 ''' self.file = askopenfilename(defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")]) if self.file == "": self.file = None else: self.root.title(os.path.basename(self.file)) self.TextArea.delete(1.0, END) file = open(self.file, "r") self.TextArea.insert(1.0, file.read()) file.close() def __newFile(self): ''' 新文件:默認(rèn)是一個(gè)未命名文件 ''' self.root.title("未命名文件") self.file = None self.TextArea.delete(1.0, END) def __saveFile(self): ''' 用于保存文件,不存在的文件進(jìn)行新建,存在的文件在原文件基礎(chǔ)上覆蓋保存 ''' if self.file == None: self.file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")]) if self.file == "": self.file = None else: file = open(self.file, "w") file.write(self.TextArea.get(1.0, END)) file.close() # 更改title名字為文件名 self.root.title(os.path.basename(self.file)) else: file = open(self.file, "w") file.write(self.TextArea.get(1.0, END)) file.close() # 添加功能項(xiàng) def __cut(self): self.TextArea.event_generate("<<Cut>>") def __copy(self): self.TextArea.event_generate("<<Copy>>") def __paste(self): self.TextArea.event_generate("<<Paste>>") def run(self): # 使用mainloop()使得窗口一直存在 self.root.mainloop() notepad = Notepad(width=600, height=400) notepad.run()
三、展示
菜單欄根據(jù)不同的系統(tǒng)會(huì)有不同的位置展示,mac嵌入在左上角,win在窗口內(nèi)部進(jìn)行嵌入。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python實(shí)現(xiàn)從概率分布中隨機(jī)采樣
這篇文章主要介紹了通過幾個(gè)機(jī)器學(xué)習(xí)中最常用的概率分布為例,來看看如何從一個(gè)概率分布中采樣,文章中的代碼對(duì)我們的工作或?qū)W習(xí)具有一定價(jià)值,感興趣的朋友可以了解一下2021-12-12Python字典刪除鍵值對(duì)和元素的四種方法(小結(jié))
刪除列表或者字符串元素的方法不止一種,同樣,刪除字典元素的方法也不止一種,本文主要介紹python中刪除字典元素的四種方法:1、使用del語句;2、使用clear();3、使用pop();4、使用popitem()。感興趣的可以了解一下2021-12-12Python使用get_text()方法從大段html中提取文本的實(shí)例
今天小編就為大家分享一篇Python使用get_text()方法從大段html中提取文本的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08在雙python下設(shè)置python3為默認(rèn)的方法
這篇文章主要介紹了如何在雙python下設(shè)置python3為默認(rèn),本文通過一個(gè)例子分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10Python生命游戲?qū)崿F(xiàn)原理及過程解析(附源代碼)
這篇文章主要介紹了Python生命游戲?qū)崿F(xiàn)原理及過程解析(附源代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08