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实现矩阵乘法的方法
Jun 28 Python
详解Django中Request对象的相关用法
Jul 17 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
对pandas处理json数据的方法详解
Feb 08 Python
Python列表切片操作实例总结
Feb 19 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
python3.7简单的爬虫实例详解
Jul 08 Python
Python类中方法getitem和getattr详解
Aug 30 Python
Python os模块常用方法和属性总结
Feb 20 Python
Python处理PDF与CDF实例
Feb 26 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 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
php批量删除数据
2007/01/18 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
JavaScript判断数组类型的方法
2019/10/23 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
python八皇后问题的解决方法
2018/09/27 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
举例讲解Python装饰器
2020/12/24 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python