Python用tkinter實(shí)現(xiàn)自定義記事本的方法詳解
一、思考
想要完成記事本,我們首先需要考慮一個(gè)正常的記事本都需要具有哪些功能,我們將這些功能按鍵添加到我們的UI界面上即可。一般功能如下:
- 新建文本文檔
- 打開本地文件
- 保存文本文檔
- 功能項(xiàng):剪切、復(fù)制、粘貼等
設(shè)定好了基本的功能選項(xiàng)之后我們再來思考實(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:滾動條
'''
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:滾動條
'''
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)
# 滾動條根據(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)會有不同的位置展示,mac嵌入在左上角,win在窗口內(nèi)部進(jìn)行嵌入。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
在Python的while循環(huán)中使用else以及循環(huán)嵌套的用法
這篇文章主要介紹了在Python的while循環(huán)中使用else以及循環(huán)嵌套的用法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
使用Python將字符串轉(zhuǎn)換為格式化的日期時(shí)間字符串
這篇文章主要介紹了使用Python將字符串轉(zhuǎn)換為格式化的日期時(shí)間字符串,需要的朋友可以參考下2019-09-09
FFT快速傅里葉變換的python實(shí)現(xiàn)過程解析
這篇文章主要介紹了FFT快速傅里葉變換的python實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
更改Ubuntu默認(rèn)python版本的兩種方法python-> Anaconda
當(dāng)你安裝 Debian Linux 時(shí),安裝過程有可能同時(shí)為你提供多個(gè)可用的 Python 版本,因此系統(tǒng)中會存在多個(gè) Python 的可執(zhí)行二進(jìn)制文件。一般Ubuntu默認(rèn)的Python版本都為2.x, 如何改變Python的默認(rèn)版本呢?下面來一起看看吧。2016-12-12
圖神經(jīng)網(wǎng)絡(luò)GNN算法基本原理詳解
這篇文章主要為大家介紹了圖神經(jīng)網(wǎng)絡(luò)GNN算法基本原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python minidom模塊用法示例【DOM寫入和解析XML】
這篇文章主要介紹了Python minidom模塊用法,結(jié)合實(shí)例形式分析了Python DOM創(chuàng)建、寫入和解析XML文件相關(guān)操作技巧,需要的朋友可以參考下2019-03-03

