1. 前言

最近要做的事情很多,琢磨着用 Python 写一个桌面便签的程序。
效果:

文件框架:

jnote
|-- notes #存储便签的文件夹
|-- jnote.py

接下来,我们开始编写便签:

2. 解析

2.1 前面的

2.1.1 导入库

这个项目需要用到GUI库 tkinter 库,这是 Python 自带的GUI库,利用以下语句导入:

import tkinter

2.1.2 创建class类

class gui:

2.1.3 颜色主题

利用字典来存储颜色主题:

colorthemes = {"yellow":["#FFFACD","#F0E68C"],"blue":["#98F5FF","#00E5EE"],"red":["#E9967A","#EE6363"],"green":["#90ee90","#32CD32"]}

2.3 GUI界面

窗口

    def setgui(self,x,y):self.root = Tk()    #窗口self.root.title('jnote')    #窗口标题self.root.geometry('200x200+{0}+{1}'.format(x,y))   #改变窗口位置self.root.wm_attributes("-topmost", True)   #窗口总在最前self.root.overrideredirect(True)    #窗口去边框,去边框后没有任务栏图标self.themecolor = list(self.colorthemes.values())[0]    #获取主题名

标题栏

        self.titleframe = Frame(self.root,bg=self.themecolor[0],bd=0)self.titleframe.grid(row=0,column=0,sticky='nswe')

拖动窗体的按钮

        self.icon = Label(self.titleframe,text='N',font=('宋体',14),cursor='fleur',anchor='center',bg=self.themecolor[0]) self.icon.grid(row=0,column=0,sticky='nswe')

标题

        self.title = Entry(self.titleframe,font=("微软雅黑",14),bd=0,bg=self.themecolor[0])self.title.grid(row=0,column=1,sticky='nswe')self.title.insert(0,'untitled')

设置按钮

        self.sets = Label(self.titleframe,text='…',font=("宋体",14),anchor='center',bg=self.themecolor[0])self.sets.grid(row=0,column=3,sticky='nswe')

关闭按钮

        self.quit = Label(self.titleframe,text='×',font=("宋体",14),anchor='center',bg=self.themecolor[0])self.quit.grid(row=0,column=4,sticky='nswe')

因为我觉得 tkinter 自带的按钮太难看,不符合我的现代化、扁平设计的要求,
因此我用 label 组件代替按钮,
利用绑定属性可以实现按钮的功能。

文本区域

        self.text = Text(self.root,font=(10),bd=0,bg=self.themecolor[0])self.text.grid(row=1,column=0,sticky='nswe')

设置填充

        self.root.grid_columnconfigure(0,weight=1)self.root.grid_rowconfigure(1,weight=1)self.titleframe.grid_columnconfigure(1,weight=1)

将标题栏、文本区域和标题随窗体大小调整而自动填充

颜色主题菜单的绑定变量

        self.themesvar = IntVar()self.themesvar.set(0)

创建菜单

        self.setsmenu = Menu(self.root,tearoff=False)self.setsmenu.add_command(label='新建',command=lambda:gui(x=self.root.winfo_x()+self.root.winfo_width()+10,y=self.root.winfo_y()))  #实例化新的gui,新建一个窗口self.setsmenu.add_cascade(label='保存',command=lambda:self.save(name=self.title.get(),text=self.text.get(1.0,'end'))) #调用self.save()方法保存文件self.setsmenu.add_separator()   #添加分隔线#颜色主题菜单self.themesmenu = Menu(self.setsmenu,tearoff=False)for i in range(len(self.colorthemes.keys())):self.themesmenu.add_radiobutton(label=list(self.colorthemes.keys())[i],variable=self.themesvar,value=i,command=self.setcolor)   #调用self.setcolor()方法设置所有组件的颜色self.setsmenu.add_cascade(label='颜色主题',menu=self.themesmenu)

窗体进入事件循环

        self.root.mainloop()

2.4 定义函数和方法

鼠标进入组件事件

    def enter(self,event):event.widget['bg'] = list(self.colorthemes.values())[self.themesvar.get()][1]   #背景颜色改变return

鼠标离开组件事件

    def leave(self,event):event.widget['bg'] = list(self.colorthemes.values())[self.themesvar.get()][0]   #背景颜色还原return

下面为窗体移动的方法

    self.xr = 0self.yr = 0def setxy(self,event):self.xr = event.xself.yr = event.yreturndef resize(self,event):        self.root.geometry('+{0}+{1}'.format(self.root.winfo_x()+event.x-self.xr,self.root.winfo_y()+event.y-self.yr))return

解释一下:
当按钮被按下,即触发 setxy 方法,它会记录下按下鼠标时鼠标的坐标。
拖动它时,,将窗体的x坐标设为: 窗体x坐标 + 拖动后的x坐标 - 按下鼠标时的x坐标,
y坐标也一样。
即可达到拖动窗体的效果。

点击菜单的颜色选项后,设置所有组件的颜色

    def setcolor(self):self.includes = [self.titleframe,self.icon,self.title,self.sets,self.quit,self.text]    #列出所有组件for r in self.includes:r.configure(bg=list(self.colorthemes.values())[self.themesvar.get()][0])    #设置组件的颜色return

弹出设置菜单

    def postsetsmenu(self,event):self.setsmenu.post(event.x_root,event.y_root)return

调用 menu 菜单的 post 方法使菜单弹出

保存文件

    def save(self,name,text):#以标题命名保存文件with open('notes/{0}.txt'.format(name),'w') as f:f.write(text)    #写入文件return

打开同路径下的 notes 文件夹保存文件

卸载窗体

    def quitapp(self,event):self.root.destroy() #销毁窗体return

2.4 绑定事件

绑定拖动事件

        self.icon.bind('<ButtonPress-1>',self.setxy)self.icon.bind('<B1-Motion>',self.resize)

设置按钮绑定单击事件,调用 self.postsetsmenu() 方法弹出菜单

        self.sets.bind('<ButtonRelease-1>',self.postsetsmenu)

关闭按钮绑定单击事件,调用 self.quitapp() 方法卸载窗体

        self.quit.bind('<ButtonRelease-1>',self.quitapp)

给所有组件绑定鼠标进入、离开事件

        self.root.bind_all('<Enter>',self.enter)self.root.bind_all('<Leave>',self.leave)

2.5 实例化GUI

利用以下代码,在程序运行时实例化GUI界面

if __name__ == '__main__':gui(x=100,y=100) #实例化GUI

在菜单的 新建 按钮中,也可以调用 start 函数实例化多个GUI界面,达到多个便签的效果

3. 完整代码

from tkinter import *   #导入tkinter库class gui:  #定义class类,GUI界面#__init__方法,导入类时自动执行这里的语句def __init__(self,x=100,y=100):self.xr = 100self.yr = 100self.colorthemes = {"yellow":["#FFFACD","#F0E68C"],"blue":["#98F5FF","#00E5EE"],"red":["#E9967A","#EE6363"],"green":["#90ee90","#32CD32"]}  #主题的字典self.setgui(x,y)    #调用self.setgui()方法做GUI界面#GUI界面    def setgui(self,x,y):self.root = Tk()    #窗口self.root.title('jnote')    #窗口标题self.root.geometry('200x200+{0}+{1}'.format(x,y))   #改变窗口位置self.root.wm_attributes("-topmost", True)   #窗口总在最前self.root.overrideredirect(True)    #窗口去边框self.themecolor = list(self.colorthemes.values())[0]    #获取主题名#标题栏self.titleframe = Frame(self.root,bg=self.themecolor[0],bd=0)self.titleframe.grid(row=0,column=0,sticky='nswe')#拖动窗体的按钮self.icon = Label(self.titleframe,text='N',font=('宋体',14),cursor='fleur',anchor='center',bg=self.themecolor[0]) self.icon.grid(row=0,column=0,sticky='nswe')#绑定拖动事件self.icon.bind('<ButtonPress-1>',self.setxy)self.icon.bind('<B1-Motion>',self.resize)      #标题self.title = Entry(self.titleframe,font=("微软雅黑",14),bd=0,bg=self.themecolor[0])self.title.grid(row=0,column=1,sticky='nswe')self.title.insert(0,'untitled')#设置按钮self.sets = Label(self.titleframe,text='…',font=("宋体",14),anchor='center',bg=self.themecolor[0])self.sets.grid(row=0,column=3,sticky='nswe')#绑定单击事件,调用self.postsetsmenu()方法弹出菜单self.sets.bind('<ButtonRelease-1>',self.postsetsmenu)#关闭按钮self.quit = Label(self.titleframe,text='×',font=("宋体",14),anchor='center',bg=self.themecolor[0])self.quit.grid(row=0,column=4,sticky='nswe')#绑定单击事件,调用self.quitapp()方法卸载窗体self.quit.bind('<ButtonRelease-1>',self.quitapp)#文本区域self.text = Text(self.root,font=(10),bd=0,bg=self.themecolor[0])self.text.grid(row=1,column=0,sticky='nswe')#给所有组件绑定鼠标进入、离开事件self.root.bind_all('<Enter>',self.enter)self.root.bind_all('<Leave>',self.leave)#设置填充self.root.grid_columnconfigure(0,weight=1)self.root.grid_rowconfigure(1,weight=1)self.titleframe.grid_columnconfigure(1,weight=1)#颜色主题菜单的绑定变量self.themesvar = IntVar()self.themesvar.set(0)#创建菜单self.setsmenu = Menu(self.root,tearoff=False)self.setsmenu.add_command(label='新建',command=lambda:gui(x=self.root.winfo_x()+self.root.winfo_width()+10,y=self.root.winfo_y()))  #实例化新的gui,新建一个窗口self.setsmenu.add_cascade(label='保存',command=lambda:self.save(name=self.title.get(),text=self.text.get(1.0,'end'))) #调用self.save()方法保存文件self.setsmenu.add_separator()   #添加分隔线#颜色主题菜单self.themesmenu = Menu(self.setsmenu,tearoff=False)for i in range(len(self.colorthemes.keys())):self.themesmenu.add_radiobutton(label=list(self.colorthemes.keys())[i],variable=self.themesvar,value=i,command=self.setcolor)   #调用self.setcolor()方法设置所有组件的颜色self.setsmenu.add_cascade(label='颜色主题',menu=self.themesmenu)self.root.mainloop()    #窗体进入事件循环#鼠标进入组件事件def enter(self,event):event.widget['bg'] = list(self.colorthemes.values())[self.themesvar.get()][1]   #背景颜色改变#鼠标离开组件事件def leave(self,event):event.widget['bg'] = list(self.colorthemes.values())[self.themesvar.get()][0]   #背景颜色还原#下面两个为窗体移动的方法def setxy(self,event):self.xr = event.xself.yr = event.ydef resize(self,event):        self.root.geometry('+{0}+{1}'.format(self.root.winfo_x()+event.x-self.xr,self.root.winfo_y()+event.y-self.yr))#点击菜单的颜色选项后,设置所有组件的颜色def setcolor(self):self.includes = [self.titleframe,self.icon,self.title,self.sets,self.quit,self.text]    #列出所有组件for r in self.includes:r.configure(bg=list(self.colorthemes.values())[self.themesvar.get()][0])    #设置组件的颜色#弹出设置菜单def postsetsmenu(self,event):self.setsmenu.post(event.x_root,event.y_root)#保存文件def save(self,name,text):#以标题命名保存文件with open('notes/{0}.txt'.format(name),'w') as f:f.write(text)    #写入文件#卸载窗体def quitapp(self,event):self.root.destroy()if __name__ == '__main__':gui(x=100,y=100) #实例化gui

该代码在 Python 3.8.6 下调试通过

4. 后记

一个桌面便签的程序完成了!

原创不易,如果你觉得这篇文章很赞的话,

点赞收藏再走吧!


yeanky

2021/5/3

【实例】Python tkinter 实例 桌面便签相关推荐

  1. 【实例】用 Python tkinter 开发 桌面便签

    1. 前言 最近要做的事情很多,琢磨着用 Python 写一个桌面便签的程序. 效果: 文件框架: Note |-- notes.txt # 存储便签的文件夹 |-- Note.py 2. 代码 话不 ...

  2. 用Python写一个桌面便签(每日计划本)

    0 前言 题主一直有写计划的习惯,每天早上第一件事情就是先把每日计划好,不写计划,感觉一天里的生活毫无头绪.但写纸质计划容易遗忘工作进程,因此在之前计划的基础上,写了一个桌面便签的小程序,话不多说,上 ...

  3. python软件桌面图标_python制作一个桌面便签软件

    # 2014.10.15 更新了memo.zip, 网盘的exe:修复:1.隔日启动不能正常加载json,加入:1.隐藏任务栏图标,2.通过垃圾桶进行窗口移动. # 2014.10.8 10.36更新 ...

  4. pyqt5实现桌面便签及提醒——逐步更新

    最近在摸鱼的过程中想用python做一个桌面便签,用于提醒自己每日的计划安排 但是实现起来较为复杂,因此记录下过程,方便之后使用pyqt5 1 窗体中控件的添加与删除 2 窗体间的信息传递 3 pyq ...

  5. PyQt Python 桌面便签与美化流程

    利用python制作桌面便签,用于复制粘贴不同软件内的信息以及记录 特点:记忆功能--能够记录边检内记录的内容以及便签在桌面上的位置,下次打开复原(以及我自己觉得很好看 先上个成品图(完整代码在文末) ...

  6. python制作桌面小程序_python2.7+PyQt5 制作桌面便签小程序

    初学PyQt5,尝试制作了如图所示桌面便签小程序,功能比较单一. 现按以下顺序记录: 一.PyQt5的安装 二.程序 三.打包 #################################### ...

  7. Python Tkinter 实现桌面小挂件

    许多朋友喜欢使用桌面便签功能,实际上就是一个桌面小挂件,类似上图所示的软件(图片来自网络) 类似的悬浮小挂件效果,实际上在Python最简单的GUI库Tkinter中就能实现.然而在Tkinter的官 ...

  8. 桌面便签程序的实现详解和源码 (下)

    来自:http://blog.csdn.net/silenceburn/article/details/6094705 在上半部分中,已经实现了一个可以运行的widget,但是没有任何业务功能, 因此 ...

  9. win10便签常驻桌面_win7桌面便签小工具可以作为工作计划软件使用吗?

    现如今,选择用提前制定工作计划的方式来提升工作效率的职场人士越来越多,因为有了工作计划,他们也就可以提前明确工作的目标以及完成的步骤,从而使得各项工作可以有序的进行.而桌面便签作为职场人士常用的电脑记 ...

最新文章

  1. 说说消息队列RocketMQ版ConsumeTimeout的含义是什么
  2. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
  3. Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
  4. 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验
  5. leetcode348. 判定井字棋胜负 好麻烦的代码
  6. 深度学习-超参数和交叉验证
  7. android os build初始化,Android 关于android.os.Build介绍
  8. mongodb最多数据库_2020 年3 月数据库排行:前 10 整体下行,出新技术了?
  9. Linux架构之NFS共享存储1
  10. python123第九周测验答案2020_脑筋急转弯:什么牛是最好骗的?这答案能笑死人...
  11. 【系统架构】ER图的画图规范和优化点
  12. MATLAB伽罗域是什么,利用伽罗华域的运算来计算生成矩阵
  13. 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
  14. 浅谈IPv4/IPv6地址转换技术-中科三方
  15. 排列组合 C(n,m)
  16. 这是我见过最好的JVM笔记,拿到阿里offer后我哭了
  17. VBA学习(一)启用VBA、变量、常量、静态变量、字符串拼接、循环语句与判断语句
  18. C@sio 计算器挑战(初学java第一篇)
  19. 【读书笔记】编程实操-位和字节(七)
  20. grep多关键词查询

热门文章

  1. java中socket实现一对一聊天
  2. 阿龙学堂-Spark 数据倾斜如何处理
  3. English trip EM3 LP 4B Home Design Relationship Teacher:Ryan
  4. 美联邦调查局 FBI 网站被黑,数千特工信息泄露
  5. MUI-创建子页面打开新页面
  6. 轻松掌握Notification的各种用法
  7. 华二紫竹2021年高考成绩查询时间,2019年华二紫竹升学数据分析!
  8. 十二时辰与时间对照表,十二经络时辰表
  9. web课程设计网页规划与设计:宠物狗狗网站设计——动物介绍(8页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 HTML网页设计制作大作业
  10. 201812CCF-CCSP竞赛:第1题-小明上学