Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

พัฒนา Notepad ด้วย Tkinter ใน Python

Tkinter เป็นไลบรารี GUI จาก Python ที่เราสามารถสร้างแอป GUI หลายตัวได้ ที่นี่ ใช้ tkinter เราจะพัฒนา text editor แบบ Notepad Notepad นี้จะมีเมนูที่เราสามารถสร้างไฟล์ใหม่ เปิดไฟล์ที่มีอยู่ บันทึกไฟล์ แก้ไข ตัดและวาง ทุกฟังก์ชันจะมีครบ

ข้อกำหนดเบื้องต้น

  • ติดตั้ง Python
  • ติดตั้ง Tkinter

หมายเหตุ: tkinter มาพร้อมเป็นไลบรารีมาตรฐานกับ Python 3.x

เพิ่มรายการเมนู

Notepad ของเราจะมีรายการเมนูหลัก 4 รายการ: File, Edit, Commands และ Help เมนู File จะมี 4 สับรายการ - New, Open, Save และ Exit

พัฒนา Notepad ด้วย Tkinter ใน Python

เมนู Edit จะมี 3 สับรายการ - cut, copy และ paste

พัฒนา Notepad ด้วย Tkinter ใน Python

เมนู Commands จะมี 1 สับรายการ - About commands

พัฒนา Notepad ด้วย Tkinter ใน Python

และเมนู Help จะมี 1 สับรายการ - About Notepad

พัฒนา Notepad ด้วย Tkinter ใน Python

เราจะให้รายการเมนูและสับรายการเหล่านี้โดยใช้โค้ดด้านล่าง:

# To open new file
    self.__thisFileMenu.add_command(label="New", command=self.__newFile)
    # To open a already existing file
    self.__thisFileMenu.add_command(label="Open", command=self.__openFile)
    # To save current file
    self.__thisFileMenu.add_command(label="Save", command=self.__saveFile)
    # To create a line in the dialog
    self.__thisFileMenu.add_separator()
    self.__thisFileMenu.add_command(label="Exit", command=self.__quitApplication)
    self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)

    # To give a feature of cut
    self.__thisEditMenu.add_command(label="Cut", command=self.__cut)
    # to give a feature of copy
    self.__thisEditMenu.add_command(label="Copy", command=self.__copy)
    # To give a feature of paste
    self.__thisEditMenu.add_command(label="Paste", command=self.__paste)
    # To give a feature of editing
    self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)

    # To create a feature of description of the notepad
    self.__thisHelpMenu.add_command(label="About Notepad", command=self.__showAbout)
    self.__thisCommandMenu.add_command(label="About Commands", command=self.__showCommand)
    self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
    self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)

เพิ่มฟังก์ชันให้แต่ละรายการเมนู

ตอนนี้เรามีรายการเมนูพร้อมแล้ว ตอนนี้เราจะเพิ่มฟังก์ชันให้แต่ละรายการเมนู ด้านล่างคือรายการฟังก์ชันที่เราจะเพิ่มใน notepad นี้ (當然 คุณสามารถเพิ่มอีกมากกว่านี้ได้)

  • Open file
  • New file
  • Save file
  • Quit Application
  • Show About
  • Show Commands
  • Cut
  • Copy
  • Paste

โค้ดด้านล่างคือการนำไปปฏิบัติ ฟังก์ชันที่กล่าวมาข้างต้น:

def __quitApplication(self):
    self.__root.destroy()
    # exit()

def __showAbout(self):
    showinfo("About Notepad", "Simple text editor like notepad using Python")

def __showCommand(self):
    showinfo("Notepad", "Just Another TextPad \n Copyright \n with BSD license you can use it'")

def __openFile(self):
    self.__file = askopenfilename(defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
    if self.__file == "":
        # no file to open
        self.__file = None
    else:
        # Try to open the file
        # set the window title
        self.__root.title(os.path.basename(self.__file) + " - Notepad")
        self.__thisTextArea.delete(1.0, END)
        file = open(self.__file, "r")
        self.__thisTextArea.insert(1.0, file.read())
        file.close()

def __newFile(self):
    self.__root.title("Untitled Notepad")
    self.__file = None
    self.__thisTextArea.delete(1.0, END)

def __saveFile(self):
    if self.__file == None:
        # Save as new file
        self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
    if self.__file == "":
        self.__file = None
    else:
        # Try to save the file
        file = open(self.__file, "w")
        file.write(self.__thisTextArea.get(1.0, END))
        file.close()
        # Change the window title
        self.__root.title(os.path.basename(self.__file) + " - Notepad")
    else:
        file = open(self.__file, "w")
        file.write(self.__thisTextArea.get(1.0, END))
        file.close()

def __cut(self):
    self.__thisTextArea.event_generate("<>")

def __copy(self):
    self.__thisTextArea.event_generate("<>")

def __paste(self):
    self.__thisTextArea.event_generate("<>")

ตอนนี้เราเพิ่มแพ็กเกจที่จำเป็น เพิ่มรายการเมนูและฟังก์ชันที่จำเป็น เราจะเห็นใน text editor แบบ notepad นี้ที่ใช้ไลบรารี tkinter

ด้านล่างคือโปรแกรมสมบูรณ์สำหรับสร้าง text editor แบบ notepad โดยใช้ tkinter:

# Import os library
import os

# import everything from tkinter
from tkinter import *

# To get the space above the message
from tkinter.messagebox import *

# To get the dialog box to open when required
from tkinter.filedialog import *

class Notepad:
    # Set up the root widget
    __root = Tk()
    __thisWidth = 500
    __thisHeight = 700
    __thisTextArea = Text(__root)
    __thisMenuBar = Menu(__root)
    __thisFileMenu = Menu(__thisMenuBar, tearoff=0)
    __thisEditMenu = Menu(__thisMenuBar, tearoff=0)
    __thisHelpMenu = Menu(__thisMenuBar, tearoff=0)
    __thisCommandMenu = Menu(__thisMenuBar, tearoff=0)

    # To add scrollbar
    __thisScrollBar = Scrollbar(__thisTextArea)
    __file = None

    def __init__(self, **kwargs):
        # icon
        try:
            self.__root.wm_iconbitmap("Notepad.ico")
        except:
            pass

        # Set window size as mentioned above (the default is 300x300)
        try:
            self.__thisWidth = kwargs['width']
        except KeyError:
            pass
        try:
            self.__thisHeight = kwargs['height']
        except KeyError:
            pass

        # the window text
        self.__root.title("Untitled-Notepad")

        # Center the window
        screenWidth = self.__root.winfo_screenwidth()
        screenHeight = self.__root.winfo_screenheight()

        # For left-aligning
        left = (screenWidth / 2) - (self.__thisWidth / 2)
        # For right-align
        top = (screenHeight / 2) - (self.__thisHeight / 2)

        # For top and bottom
        self.__root.geometry('%dx%d+%d+%d' % (self.__thisWidth, self.__thisHeight, left, top))

        # To make the textarea auto resizable
        self.__root.grid_rowconfigure(0, weight=1)
        self.__root.grid_columnconfigure(0, weight=1)

        # Add controls (widget)
        self.__thisTextArea.grid(sticky=N + E + S + W)

        # To open new file
        self.__thisFileMenu.add_command(label="New", command=self.__newFile)
        # To open a already existing file
        self.__thisFileMenu.add_command(label="Open", command=self.__openFile)
        # To save current file
        self.__thisFileMenu.add_command(label="Save", command=self.__saveFile)
        # To create a line in the dialog
        self.__thisFileMenu.add_separator()
        self.__thisFileMenu.add_command(label="Exit", command=self.__quitApplication)
        self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)

        # To give a feature of cut
        self.__thisEditMenu.add_command(label="Cut", command=self.__cut)
        # to give a feature of copy
        self.__thisEditMenu.add_command(label="Copy", command=self.__copy)
        # To give a feature of paste
        self.__thisEditMenu.add_command(label="Paste", command=self.__paste)
        # To give a feature of editing
        self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)

        # To create a feature of description of the notepad
        self.__thisHelpMenu.add_command(label="About Notepad", command=self.__showAbout)
        self.__thisCommandMenu.add_command(label="About Commands", command=self.__showCommand)
        self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
        self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)

        self.__root.config(menu=self.__thisMenuBar)

        self.__thisScrollBar.pack(side=RIGHT, fill=Y)

        # Scrollbar will adjust automatically according to the content
        self.__thisScrollBar.config(command=self.__thisTextArea.yview)
        self.__thisTextArea.config(yscrollcommand=self.__thisScrollBar.set)

    def __quitApplication(self):
        self.__root.destroy()
        # exit()

    def __showAbout(self):
        showinfo("About Notepad", "Simple text editor like notepad using Python")

    def __showCommand(self):
        showinfo("Notepad", "Just Another TextPad \n Copyright \n with BSD license you can use it'")

    def __openFile(self):
        self.__file = askopenfilename(defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
        if self.__file == "":
            # no file to open
            self.__file = None
        else:
            # Try to open the file
            # set the window title
            self.__root.title(os.path.basename(self.__file) + " - Notepad")
            self.__thisTextArea.delete(1.0, END)
            file = open(self.__file, "r")
            self.__thisTextArea.insert(1.0, file.read())
            file.close()

    def __newFile(self):
        self.__root.title("Untitled Notepad")
        self.__file = None
        self.__thisTextArea.delete(1.0, END)

    def __saveFile(self):
        if self.__file == None:
            # Save as new file
            self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
        if self.__file == "":
            self.__file = None
        else:
            # Try to save the file
            file = open(self.__file, "w")
            file.write(self.__thisTextArea.get(1.0, END))
            file.close()
            # Change the window title
            self.__root.title(os.path.basename(self.__file) + " - Notepad")
        else:
            file = open(self.__file, "w")
            file.write(self.__thisTextArea.get(1.0, END))
            file.close()

    def __cut(self):
        self.__thisTextArea.event_generate("<>")

    def __copy(self):
        self.__thisTextArea.event_generate("<>")

    def __paste(self):
        self.__thisTextArea.event_generate("<>")

    def run(self):
        # Run main application
        self.__root.mainloop()

# Run main application
notepad = Notepad(width=600, height=400)
notepad.run()

เมื่อรันโปรแกรมข้างต้น เราจะได้ pop-up notepad text editor ประมาณนี้:

พัฒนา Notepad ด้วย Tkinter ใน Python

ใน notepad นี้ เราสามารถเขียน บันทึก และเปิดไฟล์ที่บันทึกไว้ (หรือไฟล์อื่นๆ) ได้ เราสามารถตัด คัดลอก และวางจากเนื้อหาของไฟล์ที่เปิดอยู่ คุณสามารถใช้รายการเมนูทั้งหมดของ notepad ที่สร้างใหม่นี้ได้