【实例】Python tkinter 实例 桌面便签
1. 前言
最近要做的事情很多,琢磨著用 Python 寫一個桌面便簽的程序。
效果:
文件框架:
jnote
|-- notes #存儲便簽的文件夾
|-- jnote.py
接下來,我們開始編寫便簽:
2. 解析
2.1 前面的
2.1.1 導入庫
這個項目需要用到GUI庫 tkinter 庫,這是 Python 自帶的GUI庫,利用以下語句導入:
import tkinter2.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() #銷毀窗體return2.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 实例 桌面便签的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LHS与RHS查询
- 下一篇: .stl,.obj 转换为.stp/.s