tkinter实现简单编辑器

一 代码

  1. import tkinter
  2. import tkinter.filedialog
  3. import tkinter.colorchooser
  4. import tkinter.messagebox
  5. import tkinter.scrolledtext
  6. #创建应用程序窗口
  7. app = tkinter.Tk()
  8. app.title('My Notepad----by cakin24')
  9. app['width']=1000
  10. app['height']=800
  11. textChanged = tkinter.IntVar()
  12. textChanged.set(0)
  13. #当前文件名
  14. filename =''
  15. #创建菜单
  16. menu = tkinter.Menu(app)
  17. #File菜单
  18. submenu = tkinter.Menu(menu, tearoff=0)
  19. defOpen():
  20. global filename
  21. #如果内容已改变,先保存
  22. if textChanged.get():
  23. yesno = tkinter.messagebox.askyesno(title='保存么?',
  24. message='要保存文件吗?')
  25. if yesno == tkinter.YES:
  26. Save()
  27. filename = tkinter.filedialog.askopenfilename(title='打开文件',
  28. filetypes=[('Text files','*.txt')])
  29. if filename:
  30. #清空内容,0.0是lineNumber.Column的表示方法
  31. txtContent.delete(0.0, tkinter.END)
  32. fp = open(filename,'r')
  33. txtContent.insert(tkinter.INSERT,''.join(fp.readlines()))
  34. fp.close()
  35. #标记为尚无修改
  36. textChanged.set(0)
  37. #创建Open菜单并绑定菜单时间处理函数
  38. submenu.add_command(label='打开', command=Open)
  39. defSave():
  40. global filename
  41. #如果是第一次保存新建文件,则打开“另存为”窗口
  42. ifnot filename:
  43. SaveAs()
  44. #如果内容发生改变,保存
  45. elif textChanged.get():
  46. fp = open(filename,'w')
  47. fp.write(txtContent.get(0.0, tkinter.END))
  48. fp.close()
  49. textChanged.set(0)
  50. submenu.add_command(label='保存', command=Save)
  51. defSaveAs():
  52. global filename
  53. #打开“另存为”窗口
  54. newfilename = tkinter.filedialog.asksaveasfilename(title='另存为...',
  55. initialdir=r'c:\\',
  56. initialfile='新文件.txt')
  57. #如果指定了文件名,则保存文件
  58. if newfilename:
  59. fp = open(newfilename,'w')
  60. fp.write(txtContent.get(0.0, tkinter.END))
  61. fp.close()
  62. filename = newfilename
  63. textChanged.set(0)
  64. submenu.add_command(label='另存为', command=SaveAs)
  65. #添加分割线
  66. submenu.add_separator()
  67. defClose():
  68. global filename
  69. Save()
  70. txtContent.delete(0.0, tkinter.END)
  71. #置空文件名
  72. filename =''
  73. submenu.add_command(label='关闭', command=Close)
  74. #将子菜单关联到主菜单上
  75. menu.add_cascade(label='文件', menu=submenu)
  76. #Edit菜单
  77. submenu = tkinter.Menu(menu, tearoff=0)
  78. #撤销最后一次操作
  79. defUndo():
  80. #启用undo标志
  81. txtContent['undo']=True
  82. try:
  83. txtContent.edit_undo()
  84. exceptExceptionas e:
  85. pass
  86. submenu.add_command(label='Undo', command=Undo)
  87. defRedo():
  88. txtContent['undo']=True
  89. try:
  90. txtContent.edit_redo()
  91. exceptExceptionas e:
  92. pass
  93. submenu.add_command(label='Redo', command=Redo)
  94. submenu.add_separator()
  95. defCopy():
  96. txtContent.clipboard_clear()
  97. txtContent.clipboard_append(txtContent.selection_get())
  98. submenu.add_command(label='拷贝', command=Copy)
  99. defCut():
  100. Copy()
  101. #删除所选内容
  102. txtContent.delete(tkinter.SEL_FIRST, tkinter.SEL_LAST)
  103. submenu.add_command(label='剪切', command=Cut)
  104. defPaste():
  105. #如果没有选中内容,则直接粘贴到鼠标位置
  106. #如果有所选内容,则先删除再粘贴
  107. try:
  108. txtContent.insert(tkinter.SEL_FIRST, txtContent.clipboard_get())
  109. txtContent.delete(tkinter.SEL_FIRST, tkinter.SEL_LAST)
  110. #如果粘贴成功就结束本函数,以免异常处理结构执行完成之后再次粘贴
  111. return
  112. exceptExceptionas e:
  113. pass
  114. txtContent.insert(tkinter.INSERT, txtContent.clipboard_get())
  115. submenu.add_command(label='粘贴', command=Paste)
  116. submenu.add_separator()
  117. defSearch():
  118. #获取要查找的内容
  119. textToSearch = tkinter.simpledialog.askstring(title='Search',
  120. prompt='What to search?')
  121. start = txtContent.search(textToSearch,0.0, tkinter.END)
  122. if start:
  123. tkinter.messagebox.showinfo(title='Found', message='Ok')
  124. #tkinter.SEL_FIRST = start
  125. #tkinter.SEL_LAST = start
  126. submenu.add_command(label='查找', command=Search)
  127. menu.add_cascade(label='编辑', menu=submenu)
  128. #Help菜单
  129. submenu = tkinter.Menu(menu, tearoff=0)
  130. defAbout():
  131. tkinter.messagebox.showinfo(title='关于', message='作者:cakin24')
  132. submenu.add_command(label='关于', command=About)
  133. menu.add_cascade(label='帮助', menu=submenu)
  134. #将创建的菜单关联到应用程序窗口
  135. app.config(menu=menu)
  136. #创建文本编辑组件
  137. txtContent = tkinter.scrolledtext.ScrolledText(app, wrap=tkinter.WORD)
  138. txtContent.pack(fill=tkinter.BOTH, expand=tkinter.YES)
  139. defKeyPress(event):
  140. textChanged.set(1)
  141. txtContent.bind('<KeyPress>',KeyPress)
  142. app.mainloop()
二 运行结果

 

猜你喜欢

转载自cakin24.iteye.com/blog/2384535