python3.5使用tkinter制作记事本


Posted in Python onJune 20, 2016

tkinter是Python下面向tk的图形界面接口库,可以方便地进行图形界面设计和交互操作编程。tkinter的优点是简单易用、与Python的结合度好。tkinter在Python 3.x下默认集成,不需要额外的安装操作;不足之处为缺少合适的可视化界面设计工具,需要通过代码来完成窗口设计和元素布局。

本节采用的Python版本为3.x,如果想在python 2.x下使用tkinter,请通过apt-get进行安装。需要注意的是,不同Python版本下的tkinter使用方式可能略有不同,建议采用Python3。

import tkinter as tk
import tkinter.scrolledtext as tkst
import fileinput
from tkinter import *
import os
import win32clipboard
import tkinter.font

t1 = []
root = None

def die(event = None):
  root.destroy()

def about():
  messagebox.showinfo(title = "当前版本为1.0,欢迎使用",message = "**作者:韩东\n**状态:继续努力ing")
#def newit(event):
  #editorit = editor()
  #editorit.neweditor()
class editor():
  def __init__(self,rt):
    if rt == None:
      self.t = tk.Tk()
    else:
      self.t = tk.Toplevel(rt)

    self.t.title("文本编辑器%d" % (len(t1)+1))
    
    

    self.frm_file = tk.Frame(rt)
    self.frm_file.grid(row =0,column =0,padx =0,sticky = W)
    self.btn_open = Button(self.frm_file,text = "打开",relief = GROOVE,command = self.openfile)
    self.btn_open.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_new = Button(self.frm_file,text = "新建",relief = GROOVE,command = self.neweditor)
    self.btn_new.pack(side =LEFT,padx =5,fill = BOTH)
    self.btn_save = Button(self.frm_file,text = "保存",relief = GROOVE,command = self.savefile)
    self.btn_save.pack(side = LEFT,padx =5,fill = BOTH)
    self.btn_saveas = Button(self.frm_file,text = "另存为",relief = GROOVE,command = self.saveasfile)
    self.btn_saveas.pack(side =LEFT,padx =5,fill = BOTH)
    self.btn_exit = Button(self.frm_file,text = "退出",relief = GROOVE,command = self.close)
    self.btn_exit.pack(side = RIGHT,padx =5,fill = BOTH)

    self.frm_edit = tk.Frame(rt)
    self.frm_edit.grid(row = 0 ,column =1,padx =1,sticky = W)
    self.btn_copy = Button(self.frm_edit,text = "复制")
    self.btn_copy.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_cut = Button(self.frm_edit,text = "剪切")
    self.btn_cut.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_paste = Button(self.frm_edit,text = "黏贴")
    self.btn_paste.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_find = Button(self.frm_edit,text = "查询")
    self.btn_find.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_allselect = Button(self.frm_edit,text = "全选")
    self.btn_allselect.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_font = Button(self.frm_edit,text = "字体样式")
    self.btn_font.pack(side = LEFT,padx =5,fill = BOTH,expand =1)
    self.btn_color = Button(self.frm_edit,text = "字体颜色")
    self.btn_color.pack(side = LEFT,padx =5,fill = BOTH,expand =1)

 

    self.bar = tk.Menu(rt)
    self.filem = tk.Menu(self.bar)
    self.filem.add_separator()
    self.filem.add_command(label = "新建",command = self.neweditor,accelerator = "     Ctr +N")
    self.filem.bind_all("<Control-n>",self.neweditor)
    self.filem.add_separator()
    self.filem.add_command(label = "打开",command = self.openfile,accelerator = "     Ctr + O")
    self.filem.bind_all("<Control-o>",self.openfile)
    self.filem.add_separator()
    self.filem.add_command(label = "保存",command = self.savefile,accelerator = "     Ctr +S ")
    self.filem.bind_all("<Control-s>",self.savefile)
    self.filem.add_separator()
    self.filem.add_command(label = "另存为",command = self.saveasfile,accelerator = "     Ctr + D ")
    self.filem.bind_all("<Control-d>",self.saveasfile)

    self.filem.add_command(label = "关闭",command = self.close,accelerator = "     F4")
    self.filem.bind_all("<F4>",self.close)
    self.filem.add_separator()
    self.filem.add_command(label = "退出",command = die,accelerator = "     ESC")
    self.filem.bind_all("<Escape>",die)

    self.editm = tk.Menu(self.bar)
    self.editm.add_separator()
    self.editm.add_command(label = "复制",command = self.copy,accelerator = " "*10 + "Ctr + C")
    self.editm.bind_all("<Control-c>",self.copy)
    self.editm.add_separator()
    self.editm.add_command(label = "黏贴",command = self.paste,accelerator = " "*10 + "Ctr + V")
    self.editm.bind_all("<Control-v>",self.paste)
    self.editm.add_separator()
    self.editm.add_command(label = "剪切",command = self.cut,accelerator = " "*10 + "Ctr + X")
    self.editm.bind_all("<Control-x>",self.cut)
    self.editm.add_separator()
    self.editm.add_command(label = "删除",command = self.delete_text,accelerator = " "*10 + "Delete")
    self.editm.bind_all("<Delete>",self.delete_text)
    self.editm.add_separator()
    self.editm.add_command(label = "查找",command = self.find_char,accelerator = " "*10 + "Ctr +F")
    self.editm.bind_all("<Control-f>",self.find_char)
    self.editm.add_separator()
    self.editm.add_command(label = "全选",command = self.select_char_all,accelerator = " "*10 + "Ctr + A")
    self.editm.bind_all("<Control-a>",self.select_char_all)

    self.formm = tk.Menu(self.bar)
    self.formm.add_command(label = "字体颜色",command = self.color_it,accelerator = " "*10 + "Alt + C")
    self.formm.bind_all("<Alt-f>",self.color_it)
    self.formm.add_separator()
    self.formm.add_command(label = "字体格式",command = self.font_it,accelerator = " "*10 + "Alt + F")
    self.formm.bind_all("<Alt-f>",self.font_it)


    self.helpm = tk.Menu(self.bar)
    self.helpm.add_command(label = "关于",command = about)

    self.bar.add_cascade(label = "文件",menu = self.filem)
    self.bar.add_cascade(label = "编辑",menu = self.editm)
    self.bar.add_cascade(label = "格式",menu = self.formm)
    self.bar.add_cascade(label = "帮助",menu = self.helpm)
    
    self.t.config(menu = self.bar)

    #self.f = tk.Frame(self.t,width = 512)
    #self.f.pack(expand =1)

    self.st = tkst.ScrolledText(self.t)
    self.st.grid(row =1,column = 0,columnspan =3,pady =3)

  def close(self,event = None):
    self.t.destroy()
  def openfile(self,event =None):
    oname = filedialog.askopenfilename(filetypes = [("打开文件","*.txt")])
    if oname:
      for line in fileinput.input(oname):
        self.st.insert("1.0",line)
      self.t.title(oname)

  def savefile(self,event =None):
    if os.path.isfile(self.t.title()):
      opf = open(self.t.title(),"w")
      opf.write(self.st.get(1.0,tk.END))
      opf.flush()
      opf.close()
      
    else:
      sname = filedialog.asksaveasfilename(title = "保存好你的宝宝哟",filetypes = [("保存文件","*.txt")],defaultextension = ".txt")
      if sname:
        ofp = open(sname,"w")
        ofp.write(self.st.get(1.0,tk.END))
        ofp.flush()
        ofp.close()
      self.t.title(sname)
  def saveasfile(self,event = None):
    sname = filedialog.asksaveasfilename(title = "保存好你的宝宝哟",filetypes = [("保存文件","*.txt")],defaultextension = ".txt")
    if sname:
      ofp = open(sname,"w")
      ofp.write(self.st.get(1.0,tk.END))
      ofp.flush()
      ofp.close()
      self.t.title(sname)
    
  def neweditor(self,event = None):
    global root
    t1.append(editor(root))


  def copy(self,event = None):
    text = self.st.get(tk.SEL_FIRST,tk.SEL_LAST)
    self.st.clipboard_clear()
    self.st.clipboard_append(text)

  def paste(self,event= None):
    try:
      text = self.st.selection_get(selection = "CLIPBOARD")
      self.st.insert(tk.INSERT,text)
      self.st.clipboard_clear()
    except tk.TclError:
      pass
    
  def cut(self,event = None):
    text = self.st.get(tk.SEL_FIRST,tk.SEL_LAST)
    self.st.delete(tk.SEL_FIRST,tk.SEL_LAST)
    self.st.clipboard_clear()
    self.st.clipboard_append(text)
    
  def delete_text(self):
    self.st.delete(tk.SEL_FIRST,tk.SEL_LAST)

  def find_char(self,event = None):
    target = simpledialog.askstring("简易文本编辑器","寻找字符串")
    if target:
      end = self.st.index(tk.END)
      print(end)
      endindex = end.split(".")
      end_line = int(endindex[0])
      end_column = int(endindex[1])
      pos_line =1
      pos_column=0
      length =len(target)
      while pos_line <= end_line :
        if pos_line == end_line and pos_column +length > end_column:
          break
        elif pos_line < end_line and pos_column + length >500:
          pos_line = pos_line + 1
          pos_column = (pos_column + length) -500
          if pos_column > end_column:
            break
        else:
          pos = str(pos_line)+"."+str(pos_column)
          where = self.st.search(target,pos,tk.END)
          if where:
            print(where)
            where1 =where.split(".")
            sele_end_col = str(int(where1[1])+length)
            sele = where1[0] + "."+ sele_end_col
            self.st.tag_add(tk.SEL,where,sele)
            self.st.mark_set(tk.INSERT,sele)
            self.st.see(tk.INSERT)
            self.st.focus()
        
            again = messagebox.askokcancel(title = "继续查询么")
            if again:
              pos_line = int(where1[0])
              pos_column = int(sele_end_col)
            else:
              aa=messagebox.showinfo(title = "你终于还是放弃了我",message = "你放弃了我--!")
              if aa:
                sys.exit()
                
  def select_char_all(self,event= None):
    self.st.tag_add(tk.SEL,1.0,tk.END)
    self.st.see(tk.INSERT)
    self.st.focus()
  def color_it(self,event = None):
    color = colorchooser.askcolor()
    self.st["foreground"] = color[1]
  def font_it(self,event = None):
    self.t_font = tk.Toplevel()
    self.t_font.title("字体选择面板")
    self.label_size = Label(self.t_font,text = "字体大小")
    self.label_shape = Label(self.t_font,text = "字体形状")
    self.label_font = Label(self.t_font,text = "字体类型")
    self.label_weight = Label(self.t_font,text = "字体粗细")
    self.label_size.grid(row = 0 ,column =0,padx =30)
    self.label_shape.grid(row = 0,column =4,padx =30)
    self.label_font.grid(row = 0,column =2,padx =30)
    self.label_weight.grid(row =0,column = 6,padx =30)
    
    self.scroll_size = Scrollbar(self.t_font)
    self.scroll_size.grid(row =1,column=1,stick = NS)
    self.scroll_shape = Scrollbar(self.t_font)
    self.scroll_shape.grid(row =1,column=3,stick = NS)
    self.scroll_font = Scrollbar(self.t_font)
    self.scroll_font.grid(row =1,column=5,stick = NS)
    self.scroll_weight = Scrollbar(self.t_font)
    self.scroll_weight.grid(row =1,column =7,stick = NS)

    list_var_font = StringVar()
    list_var_size = StringVar()
    list_var_shape = StringVar()
    list_var_weight = StringVar()
    
    self.list_font = Listbox(self.t_font,selectmode = BROWSE,listvariable = list_var_font,exportselection =0)
    self.list_font.grid(row = 1,column =2,padx =4)
    list_font_item = ["\"Arial\"","\"Arial Baltic\"","\"Arial Black\"","\"Arial CE\"","\"Arial CYR\"","\"Arial Greek\"","\"Arial Narrow\"",
             "\"Arial TUR\"","\"Baiduan Number\"","\"Batang,BatangChe\""]
    for item in list_font_item:
      self.list_font.insert(0,item)
    self.list_font.bind("<ButtonRelease-1>",self.change_font)

    self.list_shape = Listbox(self.t_font,selectmode = BROWSE,listvariable =list_var_shape,exportselection =0 )
    self.list_shape.grid(row= 1,column =4,padx =4)
    list_shape_item = ["italic","roman"]
    for item in list_shape_item:
      self.list_shape.insert(0,item)
    self.list_shape.bind("<ButtonRelease-1>",self.change_shape)

    self.list_size = Listbox(self.t_font,selectmode = BROWSE,listvariable = list_var_size,exportselection =0)
    self.list_size.grid(row = 1,column = 0,padx =4)
    list_size_item = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
    for item in list_size_item :
      self.list_size.insert(0,item)
    self.list_size.bind("<ButtonRelease-1>",self.change_size)
    
    self.list_weight = Listbox(self.t_font,selectmode = BROWSE,listvariable = list_var_weight,exportselection =0)
    self.list_weight.grid(row=1,column =6,padx =4)
    list_weight_item = ["bold","normal"]
    for item in list_weight_item:
      self.list_weight.insert(0,item)
    self.list_weight.bind("<ButtonRelease-1>",self.change_weight)
    
    self.labFra_display = LabelFrame(self.t_font,text = "字体样式演示区域")
    self.labFra_display.grid(row =2,column =0,pady =4)
    self.lab_display = Label(self.labFra_display,text = "我在这里")
    self.lab_display.pack()

    self.btn_ok = Button(self.t_font,text = "确定",width = 10,height =2,command = self.change)
    self.btn_ok.grid(row = 2,column = 2,pady =4)
    self.btn_cancel = Button(self.t_font,width =10,height =2,text = "取消",command = self.exit_subwindow)
    self.btn_cancel.grid(row =2,column =4,pady =4)
  def change_size(self,event):
    tk.customFont = font.Font(family = "Helvetica",size = 12,weight = "normal",slant = "roman",underline =0)
    size = tk.customFont["size"]
    tk.customFont.configure(size =self.list_size.get(self.list_size.curselection()))
    self.st.config(font = tk.customFont)
    self.size_count = 1
    pass
    
    
  def change_font(self,event):
    tk.customFont = font.Font(family = "Helvetica",size = 12,weight = "normal",slant = "roman",underline =0)
    family = tk.customFont["family"]
    tk.customFont.configure(family =self.list_font.get(self.list_font.curselection()))
    self.st.config(font = tk.customFont)
    self.font_count = 1
    pass

  def change_shape(self,event):
    tk.customFont = font.Font(family = "Helvetica",size = 12,weight = "normal",slant = "roman",underline =0)
    slant = tk.customFont["slant"]
    tk.customFont.configure(slant =self.list_shape.get(self.list_shape.curselection()))
    self.st.config(font = tk.customFont)
    self.shape_count =1
    pass
  def change_weight(self,event):
    tk.customFont = font.Font(family = "Helvetica",size = 12,weight = "normal",slant = "roman",underline =0)
    weight = tk.customFont["weight"]
    tk.customFont.configure(weight =self.list_weight.get(self.list_weight.curselection()))
    self.st.config(font = tk.customFont)
    self.shape_count =1
    
    
  def change(self,event):
    pass
    #self.st["font"] = (self.list_size.get(self.list_size.curselection()))
    #self.st["font"] = (self.list_font.get(self.list_font.curselection()))
    #self.st["font"] = (self.list_shape.get(self.list_shape.curselection()))
  
  def exit_subwindow(self):
    self.t_font.destroy()
    
    
if __name__ == "__main__":
  root = None
  t1.append(editor(root))
  root = t1[0].t
  root.mainloop()

以上就是本文给大家分享的代码了,希望大家能够喜欢

Python 相关文章推荐
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
python实现批量注册网站用户的示例
Feb 22 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
python实现横向拼接图片
Mar 23 Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
Python词云的正确实现方法实例
May 08 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 #Python
python3 与python2 异常处理的区别与联系
Jun 19 #Python
浅谈Python的异常处理
Jun 19 #Python
qpython3 读取安卓lastpass Cookies
Jun 19 #Python
python3实现读取chrome浏览器cookie
Jun 19 #Python
python3 实现的人人影视网站自动签到
Jun 19 #Python
python3实现暴力穷举博客园密码
Jun 19 #Python
You might like
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
thinkphp分页集成实例
2017/07/24 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
python中JWT用户认证的实现
2020/05/18 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
先进工作者获奖感言
2014/02/08 职场文书
股东合作协议书
2014/04/14 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
工程质量保证书
2015/05/09 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
Win10系统下配置Java环境变量
2021/06/13 Java/Android