首頁 > 軟體

Python用tkinter實現自定義記事本的方法詳解

2022-03-31 13:02:50

一、思考

想要完成記事本,我們首先需要考慮一個正常的記事本都需要具有哪些功能,我們將這些功能按鍵新增到我們的UI介面上即可。一般功能如下:

  • 新建文字檔案
  • 開啟本地檔案
  • 儲存文字檔案
  • 功能項:剪下、複製、貼上等

設定好了基本的功能選項之後我們再來思考實現記事本的思路。

  • 建立記事本視窗
  • 設定記事本選單項
  • 給不同的選單項設定不同的功能選項
  • 執行筆電

二、程式碼實現

建立記事本視窗

建立視窗的時候,我們要設定好視窗的高度、寬度、文字區域以及各種選單,與設定的內容如下:

class Notepad:
    root = Tk()
    '''
    Width:寬度
    Heith:高度
    TextArea:文字區域
    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

設定記事本選單項

設定好了基本的框架之後,接下來就是向整個框架中填入各種引數與設定項,包括選單欄中各種功能選項、視窗標題、視窗位置等。

後續如果向新增新的功能在init函數中進行新增即可

選單項程式碼範例:

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)

設定功能選項

接下來就是構建不同的功能函數,實現每一個小功能,這裡不需要我們編寫獨立的功能函數程式碼,只需要使用tkinter中的函數進行再封裝即可。

設定功能範例程式碼:

def __newFile(self):
    '''
    新檔案:預設是一個未命名檔案
    '''
    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:文字區域
    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):
        # 設定文字方塊的大小
        try:
            self.Width = kwargs['width']
        except KeyError:
            pass
        try:
            self.Height = kwargs['height']
        except KeyError:
            pass
        # 設定視窗標題
        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))
        # 文字區域大小調整
        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)
        # 選單中設定檔案按鈕
        self.MenuBar.add_cascade(label="檔案", menu=self.FileMenu)
        # 增加剪下功能
        self.EditMenu.add_command(label="剪下", command=self.__cut)
        # 增加複製功能
        self.EditMenu.add_command(label="複製", command=self.__copy)
        # 增加貼上功能
        self.EditMenu.add_command(label="貼上", command=self.__paste)
        # 選單中設定編輯按鈕
        self.MenuBar.add_cascade(label="編輯", menu=self.EditMenu)
        # 增加關於記事本選項
        self.HelpMenu.add_command(label="關於記事本", command=self.__showAbout)
        # 選單中射者幫助按鈕
        self.MenuBar.add_cascade(label="幫助", menu=self.HelpMenu)
        self.root.config(menu=self.MenuBar)
        self.ScrollBar.pack(side=RIGHT, fill=Y)
        # 卷軸根據內容進行調整
        self.ScrollBar.config(command=self.TextArea.yview)
        self.TextArea.config(yscrollcommand=self.ScrollBar.set)
    def __quitApplication(self):
        '''
        用於退出程式(關了就消失)
        '''
        self.root.destroy()
    def __showAbout(self):
        '''
        新增幫助選單中的資訊
        '''
        showinfo("關於記事本", "來自:二哥不像程式設計師")
    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):
        '''
        新檔案:預設是一個未命名檔案
        '''
        self.root.title("未命名檔案")
        self.file = None
        self.TextArea.delete(1.0, END)
    def __saveFile(self):
        '''
        用於儲存檔案,不存在的檔案進行新建,存在的檔案在原檔案基礎上覆蓋儲存
        '''
        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()
    # 新增功能項
    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()

三、展示

選單欄根據不同的系統會有不同的位置展示,mac嵌入在左上角,win在視窗內部進行嵌入。

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!

 


IT145.com E-mail:sddin#qq.com