搜尋
首頁後端開發Python教學python3.5使用tkinter制作记事本

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()

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使用ttkbootstrap为Python GUI创建优美的界面?如何使用ttkbootstrap为Python GUI创建优美的界面?May 07, 2023 pm 03:40 PM

这两张图片是截取官网上提供的展示效果图:主题切换简单的主题切换,由于当前窗口上组件很少,所以感觉效果不明显,但是当组件布局很多时就会很好看。importttkbootstrapasttkfromttkbootstrap.constantsimport*root=ttk.Window()style=ttk.Style()theme_names=style.theme_names()#以列表的形式返回多个主题名theme_selection=ttk.Frame(root,padding=(10,10

Python-Tkinter中的树状视图滚动条Python-Tkinter中的树状视图滚动条Aug 20, 2023 pm 05:57 PM

在图形用户界面(GUI)中处理层次数据时,通常需要以结构化和有组织的方式显示数据。Python-Tkinter中的Treeview小部件提供了一种以用户友好的方式呈现层次数据的强大解决方案。然而,随着Treeview中项目的数量增加,包含滚动条以确保平滑的导航和可用性变得至关重要。首先,请确保您的系统上安装了Python和Tkinter。推荐使用Python3以提高兼容性和功能。如果您没有安装Tkinter,可以使用Python软件包管理器pip轻松安装它。打开您的终端或命令提示符,并运行以下命

使用Tkinter在Python中的Place_forget()方法使用Tkinter在Python中的Place_forget()方法Sep 03, 2023 am 11:25 AM

Tkinter,apopularGUItoolkitforPython,offersaplethoraoftoolstodesignintuitiveandinteractiveinterfaces,amongthese,thePlace_forget()methodstandsoutasapowerfultoolfordynamicGUIlayoutmanipulation.Thismethodenablesdeveloperstoeffortlesslyhideorremovewidgets

Python Tkinter GUI编程怎么实现Frame切换Python Tkinter GUI编程怎么实现Frame切换May 11, 2023 pm 04:25 PM

1、Frame的tkraise()方法介绍通常,一个Tkinter应用程序由多个Frame组成。而且您经常需要在Frame之间切换以显示与用户选择相关的Frame。Tkinter允许将Frame堆叠在一起。要显示特定Frame,只需按堆叠顺序将一个放在另一个之上。顶部Frame将可见。要将Frame置于顶部,可以使用Frame小部件的tkraise()方法,如下所示:frame.tkraise()2、tkraise用法示例下面将实现一个温度转换小应用,华氏温度和摄氏温度分别使用两个不同的Fram

Python GUI布局工具Tkinter使用方法是什么Python GUI布局工具Tkinter使用方法是什么May 09, 2023 pm 02:16 PM

图形用户界面(GUI)图形用户界面(GUI)只不过是一个桌面应用程序,可帮助我们与计算机进行交互像文本编辑器这样的GUI应用程序可以创建、读取、更新和删除不同类型的文件数独、国际象棋和纸牌等应用程序则是游戏版的GUI程序还有GoogleChrome、Firefox和MicrosoftEdge之类的GUI应用程序是用来浏览Internet的这些都是我们日常在电脑上使用的一些不同类型的GUI应用程序,其实我们通过Tkinter也是可以构建简单的类似应用程序的今天我们作为GUI的入门,将创建一个非常简

怎么使用Python+tkinter编写一个强制表白神器怎么使用Python+tkinter编写一个强制表白神器May 19, 2023 am 11:31 AM

尽管Python提供了多个消息框已经能够满足大部分正常人的需求,但并不够灵活,所以有的时候不得不自定义消息框。新建窗口消息框的本质是一个窗口、一段信息,外加两个按钮importtkinterastkFONT=("微软雅黑",20)defmsgBox(txt,yesFunc=None,noFunc=None):win=tk.Tk()win.title("started")win.geometry("400x200+300+100")lab

详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器