📜  使用Tkinter制作记事本

📅  最后修改于: 2020-05-03 06:46:47             🧑  作者: Mango

让我们看看如何使用Tkinter在Python中创建一个简单的记事本。 该记事本GUI将包含各种菜单,例如文件和编辑,使用该菜单可以完成所有功能,例如保存文件,打开文件,编辑,剪切和粘贴。
现在要创建此记事本,您的系统中应该已经安装了Python 3和Tkinter。 您可以根据系统要求下载合适的Python软件包 。 成功安装Python之后,您需要安装Tkinter(Python的GUI软件包)。
使用此命令安装Tkinter:

pip install Python-tk

导入Tkinter:

 import tkinter
  import os
  from tkinter import *
 # 获取上面的消息空间
  from tkinter.messagebox import *
 # 要在需要时打开对话框
  from tkinter.filedialog import *

注意: messagebox用于在称为记事本的白框中写入消息,而filedialog用于在从系统中任何位置打开文件或将文件保存在特定位置或位置时出现的对话框。

添加菜单:

 # 添加控件(小工具)
  self .__thisTextArea.grid(sticky = N + E + S + W)
 # 打开新文件
  self .__thisFileMenu.add_command(label = "New" ,
                                  command = self .__newFile)
 # 打开一个已经存在的文件
  self .__thisFileMenu.add_command(label = "Open" ,
                                  command = self .__openFile)
 # 保存当前文件
  self .__thisFileMenu.add_command(label = "Save" ,
                                  command = self .__saveFile)
 # 在对话框中创建一行
  self .__thisFileMenu.add_separator()
 # 终止
  self .__thisFileMenu.add_command(label = "Exit" ,
                                  command = self .__quitApplication)
  self .__thisMenuBar.add_cascade(label = "File" ,
                                 menu = self .__thisFileMenu)
 # 赋予剪裁功能
  self .__thisEditMenu.add_command(label = "Cut" ,
                                  command = self .__cut)
 # 赋予复制功能
  self .__thisEditMenu.add_command(label = "Copy" ,
                                  command = self .__copy)
 # 赋予粘贴功能
  self .__thisEditMenu.add_command(label = "Paste" ,
                                  command = self .__paste)
 # 赋予编辑功能
  self .__thisMenuBar.add_cascade(label = "Edit" ,
                                 menu = self .__thisEditMenu)
 # 创建记事本描述功能
  self .__thisHelpMenu.add_command(label = "About Notepad" ,
                                  command = self .__showAbout)
  self .__thisMenuBar.add_cascade(label = "Help" ,
                                 menu = self .__thisHelpMenu)
  self .__root.config(menu = self .__thisMenuBar)
  self .__thisScrollBar.pack(side = RIGHT, fill = Y)
 # 滚动条将根据内容自动调整
  self .__thisScrollBar.config(command = self .__thisTextArea.yview)
  self .__thisTextArea.config(yscrollcommand = self .__thisScrollBar. )

使用此代码,我们将在记事本的窗口中添加菜单,并向其添加复制,粘贴,保存等内容。
添加功能:

  def __quitApplication( self ):
      self .__root.destroy()
     # exit()
  def __showAbout( self ):
      showinfo( "Notepad" , "Mrinal Verma" showinfo( "Mrinal Verma" )
  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) + " - 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 :
         # 另存为新文件
          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 .__thisTextArea.get( 1.0 ,END))
              file .close()
             # 更改窗口标题
              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( "<>" )

在此我们添加了记事本中所需的所有功能,您也可以在其中添加其他功能,例如字体大小,字体颜色,粗体,带下划线的等。
合并后的主要代码:

 import tkinter
  import os
  from tkinter import *
  from tkinter.messagebox import *
  from tkinter.filedialog import *
  class Notepad:
      __root = Tk()
     # 默认窗口宽度和高度
      __thisWidth = 300
      __thisHeight = 300
      __thisTextArea = Text(__root) __thisTextArea Text(__root)
      __thisMenuBar = Menu(__root) __thisMenuBar Menu(__root)
      __thisFileMenu = Menu(__thisMenuBar, tearoff = 0 )
      __thisEditMenu = Menu(__thisMenuBar, tearoff = 0 )
      __thisHelpMenu = Menu(__thisMenuBar, tearoff = 0 )
     # 添加滚动条
      __thisScrollBar = Scrollbar(__thisTextArea)
      __file = None
      def __init__( self , * * kwargs):
         # 设置图标
          try :
                  self .__root.wm_iconbitmap( "Notepad.ico" )
          except :
                 pass
         # 设置窗口大小(默认为300x300)
          try :
              self .__thisWidth = kwargs[ 'width' ]
          except KeyError:
             pass
          try :
              self .__thisHeight = kwargs[ 'height' ]
          except KeyError:
             pass
         # 设定视窗文字
          self .__root.title( "Untitled - Notepad" )
         # 将窗口居中
          screenWidth = self .__root.winfo_screenwidth()
          screenHeight = self .__root.winfo_screenheight()
         # 对于左对齐
          left = (screenWidth / 2 ) - ( self .__thisWidth / 2 )
         # 对于右倾
          top = (screenHeight / 2 ) - ( self .__thisHeight / 2 )
         # 对于顶部和底部
          self .__root.geometry( '%dx%d+%d+%d' % ( self .__thisWidth,
                                                self .__thisHeight,
                                               left, top))
         # 使文本区域自动调整大小
          self .__root.grid_rowconfigure( 0 , weight = 1 )
          self .__root.grid_columnconfigure( 0 , weight = 1 )
         # 添加控件(小工具)
          self .__thisTextArea.grid(sticky = N + E + S + W)
         # 打开新文件
          self .__thisFileMenu.add_command(label = "New" ,
                                          command = self .__newFile)
         # 打开一个已经存在的文件
          self .__thisFileMenu.add_command(label = "Open" ,
                                          command = self .__openFile)
         # 保存当前文件
          self .__thisFileMenu.add_command(label = "Save" ,
                                          command = self .__saveFile)
         # 在对话框中创建一行
          self .__thisFileMenu.add_separator()
          self .__thisFileMenu.add_command(label = "Exit" ,
                                          command = self .__quitApplication)
          self .__thisMenuBar.add_cascade(label = "File" ,
                                         menu = self .__thisFileMenu)
         # 赋予剪裁功能
          self .__thisEditMenu.add_command(label = "Cut" ,
                                          command = self .__cut)
         # 赋予复制特征
          self .__thisEditMenu.add_command(label = "Copy" ,
                                          command = self .__copy)
         # 赋予粘贴功能
          self .__thisEditMenu.add_command(label = "Paste" ,
                                          command = self .__paste)
         # 赋予编辑功能
          self .__thisMenuBar.add_cascade(label = "Edit" ,
                                         menu = self .__thisEditMenu)
         # 创建记事本描述功能
          self .__thisHelpMenu.add_command(label = "About Notepad" ,
                                          command = self .__showAbout)
          self .__thisMenuBar.add_cascade(label = "Help" ,
                                         menu = self .__thisHelpMenu)
          self .__root.config(menu = self .__thisMenuBar)
          self .__thisScrollBar.pack(side = RIGHT,fill = Y)
         # 滚动条将根据内容自动调整
          self .__thisScrollBar.config(command = self .__thisTextArea.yview)
          self .__thisTextArea.config(yscrollcommand = self .__thisScrollBar. )
      def __quitApplication( self ):
          self .__root.destroy()
         # exit()
      def __showAbout( self ):
          showinfo( "Notepad" , "Mrinal Verma" showinfo( "Mrinal Verma" )
      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) + " - 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 :
             # 另存为新文件
              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 .__thisTextArea.get( 1.0 ,END))
                  file .close()
                 # 更改窗口标题
                  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 ):
         # 运行主应用程序
          self .__root.mainloop()
 # 运行主应用程序
  notepad = Notepad(width = 600 ,height = 400 )
 notepad.run()

要运行此代码,请使用扩展名.py保存,然后打开cmd(命令提示符)并移至保存的文件的位置,然后编写以下内容

python "filename".py

然后按回车,它将运行。 或者可以通过双击.py扩展文件直接运行。