之前在看tkinter与python编程 ,后面学opengl就把那本书搁置了。几天没用tkinter,怕是基本的创建组件那些都忘记了,所以想着用tkinter试着写一下记事本程序。一开始的时候以为很简单,真正写的时候才发现复杂得很。主要写着写着都没有耐心写下去了

另外这个程序使用了一些windows系统的特性,其他系统运行应该会出错吧...

from tkinter import *
import Pmw
import win32api
import win32con
import pywintypes
from PIL import Image,ImageTk
import tkinter.messagebox
import os
import glob
import tkinter.filedialog
import time def create_topleve(title,width=500,height=500):
topleve=Toplevel()
topleve.title(title)
topleve.geometry("{}x{}".format(width,height))
#topleve.attributes("-toolwindow", 1)
#topleve.transient(1)
topleve.lift()
hwnd = pywintypes.HANDLE(int(topleve.frame(), 16)) style=win32api.GetWindowLong(hwnd,win32con.GWL_STYLE)&~win32con.WS_MAXIMIZEBOX&~win32con.WS_MINIMIZEBOX
win32api.SetWindowLong(hwnd,win32con.GWL_STYLE,style)
return topleve #文件操作
file_name=""
#新建文件
def new_file():
global file_name
str=text.get(1.0,END)
if len(str)!=1:
r=tkinter.messagebox.askyesnocancel("记事本","检测到记事本中有输入内容,是否保存?")
if r==TRUE:
pass
elif r==FALSE:
file_name="无标题"
root.title(file_name)
text.delete(1.0,END)
else:
pass
else:
file_name="无标题"
root.title(file_name)
text.delete(1.0,END) def open_file():
global file_name
file_name=tkinter.filedialog.askopenfilename(defaultextension = '.txt',initialdir="f:")
if file_name=="":
file_name="无标题"
else:
root.title(file_name) with open(file_name,"r") as f:
try:
text.delete(1.0,END)
text.insert(1.0,f.read())
except:
file_name="无标题"
tkinter.messagebox.showwarning("打开","打开文件出错")
root.title(file_name) def save_file():
global file_name
print(file_name)
try:
with open(file_name,"w") as f:
f.write(text.get(1.0,END))
except:
save_file_as() def save_file_as():
global file_name
file_path=tkinter.filedialog.asksaveasfilename(initialfile="*.txt",defaultextension=".txt",initialdir="f:")
if file_path!="":
file_name=file_path
try:
with open(file_name,"w") as f:
f.write(text.get(1.0,END))
root.title(os.path.basename(file_name))
except:
file_name="无标题"
tkinter.messagebox.showwarning("打开","打开文件出错")
else:
pass
root.title(file_name) def set_pages():
pass def print_pages():
pass #退出
def exit_window():
global root
root.destroy() #文本编辑 def e_undo():
global text
text.event_generate('<<Undo>>') def e_cut():
global text
text.event_generate('<<Cut>>') def e_copy():
global text
text.event_generate('<<Copy>>') def e_paste():
global text
text.event_generate('<<Paste>>') def e_del():
global text
text.event_generate('<<Clear>>') def e_find():
find_box=create_topleve("查找",height=50,width=410)
f1=Frame(find_box)
Label(f1,text="查找内容(N):").pack(side=LEFT,padx=10)
var=StringVar()
entry=Entry(f1,width=30,textvariable=var)
entry.pack(side=LEFT,padx=10)
Button(f1,text="确认查找",relief=GROOVE,borderwidth=2,command=lambda:find_text(var.get())).pack(side=LEFT,padx=10)
f1.pack(side=TOP,pady=10) def find_text(str):
#print(str)
countVar = StringVar()
pos = text.search(str, "1.0", stopindex="end", count=countVar)
text.tag_add("search", pos, "%s + %sc" %(pos, countVar.get()))
text.tag_configure("search", background="orange") def e_find_next():
pass def e_replace():
pass def e_goto():
pass def e_select_all():
text.tag_add(SEL, "1.0", END) def e_insert_date():
text.insert(INSERT,time.ctime()) #设置字体
class ChoiceFont:
def __init__(self):
global font
font="Gabriola"
self.fontNames=self.getwinsysfont()
self.root=create_topleve("设置字体",width=300,height=400) font_list=Pmw.ComboBox(self.root,label_text="选择字体",labelpos="wn",
listbox_width=30,dropdown=0,
selectioncommand=self.choseEntry,
scrolledlist_items=self.fontNames)
font_list.pack(fill=BOTH,expand=1,padx=8,pady=8) Label(self.root,text="预览").pack(anchor=NW,padx=20)
font_list.selectitem("Gabriola") self.str="Stray birds of summer come to my window to sing and fly away.And yellow leaves of autumn, which have no songs, flutter and fall there with a sign"
self.show=Label(self.root,text=self.str,font=("Gabriola",10),padx=5,anchor="w",relief=SUNKEN,wraplength=250)
self.show.pack(padx=20,pady=10,expand=1,fill=X) self.cancelbtn=Button(self.root,text="取消",command=self.close).pack(side=RIGHT,padx=20)
self.okbtn=Button(self.root,text="确定",command=self.set_font_to_text).pack(side=RIGHT) def close(self):
self.root.after(1, self.root.destroy) def choseEntry(self,entry):
self.show.configure(font="%s 10"%entry) font=entry def set_font_to_text(self):
try:
text.tag_add("selectedtext",SEL_FIRST,SEL_LAST)
text.tag_config("selectedtext", font=font)
#print(font)
except:
#tkinter.messagebox.showwarning("提示","未选中文本,请先选中文本再操作")
pass
self.close() def getwinsysfont(self):
font_abspaths=glob.glob(r"C:\Windows\Fonts\*.*")
font_relpaths=[]
font_names=[]
for font_abspath in font_abspaths:
font_relpaths.append(font_abspath.split("\\")[-1]) for font_relpath in font_relpaths:
(font_name,ext)=os.path.splitext(font_relpath)
font_names.append(font_name)
return font_names #设置其他格式 def set_more_format(n):
try:
text.tag_add("selectedtext",SEL_FIRST,SEL_LAST)
if n==1:
text.tag_config("selectedtext", underline=TRUE)
if n==2:
text.tag_config("selectedtext", overstrike=TRUE)
except:
#tkinter.messagebox.showwarning("提示","未选中文本,请先选中文本再操作")
pass def destroy_topleve(master):
master.after(1,master.destroy()) #关于框
def about_program():
about_topleve=create_topleve("关于") cv_about=Canvas(about_topleve)
cv_about.pack(fill=BOTH,expand=1) im=Image.open("icon_max.png")
global img
img=ImageTk.PhotoImage(im) ad_f1=Frame(cv_about)
ab_icon=Label(ad_f1,image=img,)#compound=CENTER
ab_icon.pack(side=LEFT)
ab_name=Label(ad_f1,text="Tkinter记事本程序",font=("Cambria 28"),fg="orange")
ab_name.pack(side=LEFT) ad_f1.pack(side=TOP,pady=30) ad_f2=Frame(cv_about)
Label(ad_f2,text="本记事本程序基于python tkinter编写",anchor=W).pack(side=TOP,expand=1,fill=X)
Label(ad_f2,text="版本:tkinter记事本程序1.0 ©2019 vocus",anchor=W).pack(side=TOP,expand=1,fill=X)
Label(ad_f2,text="本程序为python界面制作学习测试程序,无申明版权",anchor=W).pack(side=TOP,expand=1,fill=X) ab_add=Label(ad_f2,text="喜欢Python的小伙伴,欢迎一起交流",anchor=W)
ab_add.pack(side=TOP,expand=1,fill=X,pady=50) ad_f2.pack(side=TOP,padx=50) line1=cv_about.create_line((50,110,450,90),width=3,fill="#2ca657",smooth=TRUE) ab_button=Button(cv_about,text="确定",command=lambda master=about_topleve:destroy_topleve(master),width=20)
cv_about.create_window(360,350,window=ab_button) root=Tk(); #菜单
mubar=Menu(root)
file_operations=Menu(mubar,tearoff=0)
file_operations.add_command(label="新建(N) Ctrl+N",command=new_file)
file_operations.add_command(label="打开(O)... Ctrl+O",command=open_file)
file_operations.add_command(label="保存(S) Ctrl+S",command=save_file)
file_operations.add_command(label="另存为(A)... ",command=save_file_as)
file_operations.add_separator()
file_operations.add_command(label="页面设置(U) ",command=set_pages,state=DISABLED)
file_operations.add_command(label="打印(P)... Ctrl+P",command=print_pages,state=DISABLED)
file_operations.add_separator()
file_operations.add_command(label="退出(X) ",command=exit_window) mubar.add_cascade(label="文件(F)",menu=file_operations) #编辑
edit_text=Menu(mubar,tearoff=0)
mubar.add_cascade(label="编辑(E)",menu=edit_text)
edit_text.add_command(label="撤销(U) Ctrl+Z",command=e_undo)
edit_text.add_separator()
edit_text.add_command(label="剪切(T) Ctrl+X",command=e_cut)
edit_text.add_command(label="复制(C) Ctrl+C",command=e_copy)
edit_text.add_command(label="粘贴(p) Ctrl+V",command=e_paste)
edit_text.add_command(label="删除(L) Del",command=e_del)
edit_text.add_separator()
edit_text.add_command(label="查找(F)... Ctrl+F",command=e_find)
edit_text.add_command(label="查找下一个(N) F3",command=e_find_next,state=DISABLED)
edit_text.add_command(label="替换(R)... Ctrl+H",command=e_replace,state=DISABLED)
edit_text.add_command(label="转到(G)... Ctrl+G",command=e_goto,state=DISABLED)
edit_text.add_separator()
edit_text.add_command(label="全选(A) Ctrl+A",command=e_select_all)
edit_text.add_command(label="时间/日期(D) F5",command=e_insert_date) #格式
format_text=Menu(mubar,tearoff=0)
mubar.add_cascade(label="格式(O)",menu=format_text)
format_text.add_command(label="自动换行(W)")
format_text.add_command(label="字体(F)",command=lambda:ChoiceFont()) format_text.add_separator() fromat_text_more=Menu(format_text,tearoff=0)
format_text.add_cascade(label="更多>>",menu=fromat_text_more)
fromat_text_more.add_command(label=" 下划线 ",command=lambda n=1:set_more_format(n))
fromat_text_more.add_command(label=" 删除线 ",command=lambda n=2:set_more_format(n)) #查看
vision=Menu(mubar,tearoff=0)
mubar.add_cascade(label="查看(V)",menu=vision)
vision.add_command(label="状态栏(S)",command="",state=DISABLED) #帮助
help_me=Menu(mubar,tearoff=0)
mubar.add_cascade(label="帮助(H)",menu=help_me)
help_me.add_cascade(label="查看帮助(H)")
help_me.add_separator()
help_me.add_cascade(label="关于记事本(A)",command=about_program) text=Text(root,bg="white")
text.pack(expand=1,fill=BOTH) #滚动条
text_scroll=Scrollbar(text,command=text.yview)
text.configure(yscrollcommand=text_scroll.set)
text_scroll.pack(side=RIGHT,fill=Y) #检查输入状态
'''
def set_title(event):
if file_name=="":
root.title("无标题"+"*")
else:
root.title(file_name+"*") text.bind("<<Modified>>",set_title) #text.edit_modified()
''' root.title("无标题")
root["menu"]=mubar
root.geometry("800x600")
root.mainloop();

程序引用图片

icon_max.png

总结一下:

1.显示处于编辑状态,<<Modified>>事件
2.添加下划线,删除线子菜单,应该是使用add_radiobutton
3.绑定快捷键
4.其他未完成的菜单功能,都禁用了

在编程上,想到哪写到哪,类和函数定义混用,也没有模块化。。

等等,还有其他的问题,以后如果有空,再来处理一下吧

程序运行

用tkinter写一个记事本程序(未完成)的更多相关文章

  1. 写一个ajax程序就是如此简单

    写一个ajax程序就是如此简单 ajax介绍: 1:AJAX全称为Asynchronous JavaScript and XML(异步JavaScript和XML),指一种创建交互式网页应用的网页开发 ...

  2. [Java] 将标准字符流写入到文件中(通过控制台写一个html程序,并保存)

    package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  3. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  4. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  5. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  6. linux常用终端指令+如何用vim写一个c程序并运行

    在装好ubuntu之后今天学习了一些linux的一些基础知识: windows里面打开命令窗口是win+r,在linux系统里面,ctrl+alt+t打开终端,今天的一些指令都是围绕终端来说的 首先s ...

  7. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  8. 基础概念(3):怎么写一个c程序?

    总结卡片: 遵循c语言的规则,即可写出c程序.规则下有两个重要概念:函数与变量.就好像游戏中的打仗,要考虑怎么打,谁来打."怎么打"就是流程,把流程封装起来就是函数,流程也叫算法. ...

  9. Python3的tkinter写一个简单的小程序

    一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...

随机推荐

  1. 开发者说 | 云+AI赋能心电医疗领域的应用

    以"医工汇聚 智竞心电"为主题的首届中国心电智能大赛自2019年1月1日启动全球招募起,共吸引总计545支来自世界各地的医工结合团队,308支团队近780名选手通过初赛资格审查,经 ...

  2. MyBatis: No MyBatis mapper was found in '[xx.mapper]' package. Please check your configuration

    在应用入口加入@MapperScan("com.IBM.XXXXX.dao")

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-star-empty

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 《Java面试全解析》1000道面试题大全详解(转)

    <Java面试全解析>1000道 面试题大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃 ...

  5. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  6. sql server C#操作。原文在收藏页面

    C#操作SQL Server数据库   1.概述 2.连接字符串的写法 3.SqlConnection对象 4.SqlCommand对象 5.SqlDataReader对象 6.DataSet对象 7 ...

  7. Java中的super关键字和this关键字作用介绍

    一.super关键字的作用 1.子类在构造方法中显示调用父类构造方法 super可以在子类的构造方法中显示调用父类的构造方法:并且这行代码必须出现在子类构造方法的第一行.原因:因为父类构造方法没有执行 ...

  8. Docker Ubuntu 例子

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  9. Linux基础操作及概念

    Linux基础操作及概念 终端的概念 通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示 ...

  10. JavaSE--日志

    参考 https://www.cnblogs.com/hanszhao/p/9754419.html https://www.cnblogs.com/chenhongliang/p/5312517.h ...