파이톤을 사용하여 간단한 텍스트 편집기 만들기

17559 단어 tkinterpythontutorial

안녕하세요!
오늘 우리는 파이톤과 Tkinter를 사용하여 간단한 텍스트 편집기를 만들 것이다.

뭐가 트킨트야?
  • Python과 함께 제공되는 Tk GUI 키트의 표준 Python 인터페이스입니다.

  • 내가 Tkinter를 설치했는지 어떻게 알 수 있습니까?
  • 당신이 그것을 설치할 가능성이 가장 높다.콘솔에서 실행을 시도합니다python -m tkinter.만약 그것이 오류를 내지 않았다면, 이것은 당신이 이미 Tkinter를 설치하고 사용할 수 있다는 것을 의미합니다.

  • 나는 Tkinter를 설치하지 않았는데, 나는 어떻게 해야 합니까?
  • 파이톤과 pip가 정상적으로 작동하는지 확인하고 컨트롤러에서 실행pip install tk하면 된다.

  • 선결 조건
  • Python 3.9.x
  • 코드 편집기(VS코드, PyCharm 등)
  • 이제 그건 중요하지 않아요. 시작합시다!!!

    튜토리얼은 여기서부터...
    우선, 우리는 파일 구조 같은 것을 만들 것이다.
    이 파일들은 루트 디렉토리에 있어야 합니다.
  • main.py
  • file_menu.py
  • edit_menu.py
  • format_menu.py
  • help_menu.py

  • 매인.pymain.py 파일의 경우 Tkinter 라이브러리와 방금 만든 메뉴 파일을 먼저 가져옵니다.
    # import statements
    from tkinter import *
    from tkinter.filedialog import *
    from tkinter.messagebox import *
    from tkinter.font import Font
    from tkinter.scrolledtext import *
    import file_menu
    import edit_menu
    import format_menu
    import help_menu
    
    그런 다음 다음과 같이 Tkinter 창을 만듭니다.
    # creating a tkinter window
    root = Tk()
    
    그런 다음 텍스트 편집기에 다음과 같은 차원과 제목을 제공합니다.
    # gives the window a title and dimensions
    root.title("TextEditor-newfile")
    root.geometry("300x250+300+300")
    root.minsize(width=400, height=400)
    
    그런 다음 다음 다음 코드를 추가합니다.
    # i don't really know how to explain what this code does, but yeah it's important
    text = ScrolledText(root, state='normal', height=400, width=400, wrap='word', pady=2, padx=3, undo=True)
    text.pack(fill=Y, expand=1)
    text.focus_set()
    
    그리고 우리는 menubar:
    # creating a menubar
    menubar = Menu(root)
    
    그런 다음 메뉴 모음에 메뉴를 추가합니다.
    # adding our menus to the menubar
    file_menu.main(root, text, menubar)
    edit_menu.main(root, text, menubar)
    format_menu.main(root, text, menubar)
    help_menu.main(root, text, menubar)
    
    마지막으로 편집기가 제대로 작동하도록 다음 코드를 추가합니다.
    # running the whole program
    root.mainloop()
    
    메뉴 파일을 계속해 주시겠습니까?

    파일 메뉴.py
    우선, 우리는 몇 가지 물건을 수입해야 한다.
    # import statements
    from tkinter import *
    from tkinter.filedialog import *
    from tkinter.messagebox import *
    
    그런 다음 클래스File를 만듭니다.
    # creating File
    class File():
    
    그런 다음 필요한 함수를 File 클래스에 추가합니다.
        def newFile(self):
            self.filename = "Untitled"
            self.text.delete(0.0, END)
    
        def saveFile(self):
            try:
                t = self.text.get(0.0, END)
                f = open(self.filename, 'w')
                f.write(t)
                f.close()
            except:
                self.saveAs()
    
        def saveAs(self):
            f = asksaveasfile(mode='w', defaultextension='.txt')
            t = self.text.get(0.0, END)
            try:
                f.write(t.rstrip())
            except:
                showerror(title="Oops!", message="Unable to save file...")
    
        def openFile(self):
            f = askopenfile(mode='r')
            self.filename = f.name
            t = f.read()
            self.text.delete(0.0, END)
            self.text.insert(0.0, t)
    
        def quit(self):
            entry = askyesno(title="Quit", message="Are you sure you want to quit?")
            if entry == True:
                self.root.destroy()
    
        def __init__(self, text, root):
            self.filename = None
            self.text = text
            self.root = root
    
    위 코드에는 다음과 같은 몇 가지 함수가 추가되었습니다.
  • 신규 파일
  • 파일 저장
  • 다른 이름으로 파일 저장
  • 파일 열기
  • 편집기 종료
  • 그리고 우리는main 함수를 생성할 것이다. (이 함수는 File 클래스에 있지 않도록 주의하십시오.)
    def main(root, text, menubar):
        filemenu = Menu(menubar)
        objFile = File(text, root)
        filemenu.add_command(label="New", command=objFile.newFile)
        filemenu.add_command(label="Open", command=objFile.openFile)
        filemenu.add_command(label="Save", command=objFile.saveFile)
        filemenu.add_command(label="Save As...", command=objFile.saveAs)
        filemenu.add_separator()
        filemenu.add_command(label="Quit", command=objFile.quit)
        menubar.add_cascade(label="File", menu=filemenu)
        root.config(menu=menubar)
    
    위 코드에서 우리는 main 함수를 만들었는데 기본적으로 File 클래스의 모든 함수를 실행한다.
    마지막으로 오류 처리 같은 것을 추가했습니다.
    if __name__ == "__main__":
        print("Please run 'main.py'")
    

    편집 메뉴.py
    컨텐트 가져오기부터 시작하겠습니다.
    # import statements
    from tkinter import *
    from tkinter.simpledialog import *
    from tkinter.filedialog import *
    from tkinter.messagebox import *
    
    그런 다음 클래스Edit를 만듭니다.
    # creating Edit
    class Edit():
    
    그리고 우리는 이 Edit 클래스에 필요한 모든 함수를 추가할 것이다.
        def popup(self, event):
            self.rightClick.post(event.x_root, event.y_root)
    
        def copy(self, *args):
            sel = self.text.selection_get()
            self.clipboard = sel
    
        def cut(self, *args):
            sel = self.text.selection_get()
            self.clipboard = sel
            self.text.delete(SEL_FIRST, SEL_LAST)
    
        def paste(self, *args):
            self.text.insert(INSERT, self.clipboard)
    
        def selectAll(self, *args):
            self.text.tag_add(SEL, "1.0", END)
            self.text.mark_set(0.0, END)
            self.text.see(INSERT)
    
        def undo(self, *args):
            self.text.edit_undo()
    
        def redo(self, *args):
            self.text.edit_redo()
    
        def find(self, *args):
            self.text.tag_remove('found', '1.0', END)
            target = askstring('Find', 'Search String:')
    
            if target:
                idx = '1.0'
                while 1:
                    idx = self.text.search(target, idx, nocase=1, stopindex=END)
                    if not idx: break
                    lastidx = '%s+%dc' % (idx, len(target))
                    self.text.tag_add('found', idx, lastidx)
                    idx = lastidx
                self.text.tag_config('found', foreground='white', background='blue')
    
        def __init__(self, text, root):
            self.clipboard = None
            self.text = text
            self.rightClick = Menu(root)
    
    위 코드에서 몇 가지 함수를 만들었습니다.
  • 던전
  • 붙여넣기
  • 전체 선택
  • 취소
  • 다시 하기
  • 검색
  • 그리고 우리는 main 클래스 이외에 Edit 함수를 만들었다.
    def main(root, text, menubar):
    
        objEdit = Edit(text, root)
    
        editmenu = Menu(menubar)
        editmenu.add_command(label="Copy", command=objEdit.copy, accelerator="Ctrl+C")
        editmenu.add_command(label="Cut", command=objEdit.cut, accelerator="Ctrl+X")
        editmenu.add_command(label="Paste", command=objEdit.paste, accelerator="Ctrl+V")
        editmenu.add_command(label="Undo", command=objEdit.undo, accelerator="Ctrl+Z")
        editmenu.add_command(label="Redo", command=objEdit.redo, accelerator="Ctrl+Y")
        editmenu.add_command(label="Find", command=objEdit.find, accelerator="Ctrl+F")
        editmenu.add_separator()
        editmenu.add_command(label="Select All", command=objEdit.selectAll, accelerator="Ctrl+A")
        menubar.add_cascade(label="Edit", menu=editmenu)
    
        root.bind_all("<Control-z>", objEdit.undo)
        root.bind_all("<Control-y>", objEdit.redo)
        root.bind_all("<Control-f>", objEdit.find)
        root.bind_all("Control-a", objEdit.selectAll)
    
        objEdit.rightClick.add_command(label="Copy", command=objEdit.copy)
        objEdit.rightClick.add_command(label="Cut", command=objEdit.cut)
        objEdit.rightClick.add_command(label="Paste", command=objEdit.paste)
        objEdit.rightClick.add_separator()
        objEdit.rightClick.add_command(label="Select All", command=objEdit.selectAll)
        objEdit.rightClick.bind("<Control-q>", objEdit.selectAll)
    
        text.bind("<Button-3>", objEdit.popup)
    
        root.config(menu=menubar)
    
    마지막으로 다음과 같은 오류 처리를 수행합니다.
    if __name__ == "__main__":
        print("Please run 'main.py'")
    

    서식 지정 메뉴.py
    컨텐트 가져오기부터 시작하겠습니다.
    # import statements
    from tkinter import *
    from tkinter.colorchooser import askcolor
    from tkinter.font import Font, families
    from tkinter.scrolledtext import *
    import time
    
    그런 다음 클래스Format를 만듭니다.
    class Format():
    
    그런 다음 필요한 기능을 추가했습니다.
        def __init__(self, text):
            self.text = text
    
        def changeBg(self):
            (triple, hexstr) = askcolor()
            if hexstr:
                self.text.config(bg=hexstr)
    
        def changeFg(self):
            (triple, hexstr) = askcolor()
            if hexstr:
                self.text.config(fg=hexstr)
    
        def bold(self, *args):  # Works only if text is selected
            try:
                current_tags = self.text.tag_names("sel.first")
                if "bold" in current_tags:
                    self.text.tag_remove("bold", "sel.first", "sel.last")
                else:
                    self.text.tag_add("bold", "sel.first", "sel.last")
                    bold_font = Font(self.text, self.text.cget("font"))
                    bold_font.configure(weight="bold")
                    self.text.tag_configure("bold", font=bold_font)
            except:
                pass
    
        def italic(self, *args):  # Works only if text is selected
            try:
                current_tags = self.text.tag_names("sel.first")
                if "italic" in current_tags:
                    self.text.tag_remove("italic", "sel.first", "sel.last")
                else:
                    self.text.tag_add("italic", "sel.first", "sel.last")
                    italic_font = Font(self.text, self.text.cget("font"))
                    italic_font.configure(slant="italic")
                    self.text.tag_configure("italic", font=italic_font)
            except:
                pass
    
        def underline(self, *args):  # Works only if text is selected
            try:
                current_tags = self.text.tag_names("sel.first")
                if "underline" in current_tags:
                    self.text.tag_remove("underline", "sel.first", "sel.last")
                else:
                    self.text.tag_add("underline", "sel.first", "sel.last")
                    underline_font = Font(self.text, self.text.cget("font"))
                    underline_font.configure(underline=1)
                    self.text.tag_configure("underline", font=underline_font)
            except:
                pass
    
        def overstrike(self, *args):  # Works only if text is selected
            try:
                current_tags = self.text.tag_names("sel.first")
                if "overstrike" in current_tags:
                    self.text.tag_remove("overstrike", "sel.first", "sel.last")
                else:
                    self.text.tag_add("overstrike", "sel.first", "sel.last")
                    overstrike_font = Font(self.text, self.text.cget("font"))
                    overstrike_font.configure(overstrike=1)
                    self.text.tag_configure("overstrike", font=overstrike_font)
            except:
                pass
    
        def addDate(self):
            full_date = time.localtime()
            day = str(full_date.tm_mday)
            month = str(full_date.tm_mon)
            year = str(full_date.tm_year)
            date = day + '/' + month + '/' + year
            self.text.insert(INSERT, date, "a")
    
    위 코드에는 다음과 같은 몇 가지 함수가 추가되었습니다.
  • 배경 변경
  • 글꼴 그룹 변경
  • 굵은 텍스트
  • 기울임꼴 텍스트
  • 밑줄 텍스트
  • 삭제 텍스트 초과
  • 추가 날짜
  • 그리고 우리는 main 함수를 만들었다.
    def main(root, text, menubar):
        objFormat = Format(text)
    
        fontoptions = families(root)
        font = Font(family="Arial", size=10)
        text.configure(font=font)
    
        formatMenu = Menu(menubar)
    
        fsubmenu = Menu(formatMenu, tearoff=0)
        ssubmenu = Menu(formatMenu, tearoff=0)
    
        for option in fontoptions:
            fsubmenu.add_command(label=option, command=lambda option=option: font.configure(family=option))
        for value in range(1, 31):
            ssubmenu.add_command(label=str(value), command=lambda value=value: font.configure(size=value))
    
        formatMenu.add_command(label="Change Background", command=objFormat.changeBg)
        formatMenu.add_command(label="Change Font Color", command=objFormat.changeFg)
        formatMenu.add_cascade(label="Font", underline=0, menu=fsubmenu)
        formatMenu.add_cascade(label="Size", underline=0, menu=ssubmenu)
        formatMenu.add_command(label="Bold", command=objFormat.bold, accelerator="Ctrl+B")
        formatMenu.add_command(label="Italic", command=objFormat.italic, accelerator="Ctrl+I")
        formatMenu.add_command(label="Underline", command=objFormat.underline, accelerator="Ctrl+U")
        formatMenu.add_command(label="Overstrike", command=objFormat.overstrike, accelerator="Ctrl+T")
        formatMenu.add_command(label="Add Date", command=objFormat.addDate)
        menubar.add_cascade(label="Format", menu=formatMenu)
    
        root.bind_all("<Control-b>", objFormat.bold)
        root.bind_all("<Control-i>", objFormat.italic)
        root.bind_all("<Control-u>", objFormat.underline)
        root.bind_all("<Control-T>", objFormat.overstrike)
    
        root.grid_columnconfigure(0, weight=1)
        root.resizable(True, True)
    
        root.config(menu=menubar)
    
    마지막으로 오류 처리 내용을 추가했습니다.
    if __name__ == "__main":
        print("Please run 'main.py'")
    

    도움말 메뉴.py
    우리 먼저 수입 물건부터 시작하자
    # import statements
    from tkinter import *
    from tkinter.messagebox import *
    
    그리고 우리는 Help 클래스를 만들고 About 함수를 추가할 것이다.
    class Help():
        def about(root):
            showinfo(title="About", message="Hello, this is a text editor made by Insidious using Python")
    
    그리고 우리는 main 함수를 만들었다.
    def main(root, text, menubar):
    
        help = Help()
    
        helpMenu = Menu(menubar)
        helpMenu.add_command(label="About", command=help.about)
        menubar.add_cascade(label="Help", menu=helpMenu)
    
        root.config(menu=menubar)
    
    마지막으로 오류 처리 같은 것을 추가했습니다.
    if __name__ == "__main":
        print("Please run 'main.py'")
    
    이렇게!
    Project on GitHub

    끝까지 읽어줘서 고마워요.그것이 당신을 도울 수 있기를 바랍니다!!!
    만약 누락된 것이 있거나 내가 잘못한 것이 있다면 댓글에'D'라고 지적해 주세요.

    사교 활동
    Discord
    GitHub
    감사합니다!!!

    좋은 웹페이지 즐겨찾기