用vscode但是没有找到像pycharm那样可以可视化编辑代码片段的插件
所以自己写了一个软件可视化编辑vscode的代码片段
此软件为py代码,自己写了
使用方法,运行一次后会生成config.ini 文件
修改代码片段路径
from tkinter import *
from tkinter import messagebox
import pickle
import os
import json
def load_config():
import configparser
fname='config.ini'
config = configparser.ConfigParser()
if not os.path.exists(fname):
config['conf'] = {'文件路径': r'C:\Users\Administrator\AppData\Roaming\Code\User\snippets\全局.code-snippets',
'默认类型':'python,javascript,java,javascript,typescript'}
with open(fname, 'w',encoding='utf-8-sig') as f:
config.write(f)
config.read(fname,encoding='utf-8-sig')
return config
class Application(Frame):
'''GUI程序经典写法'''
def __init__(self,master = None):
super().__init__(master)
# super() 表示父类的定义,父类使用 master 参数
self.master = master
# 子类定义一个属性接收传递过来的 master 参数
self.pack()
# .pack 设置布局管理器
self.createWidget()
# 在初始化时,将按钮也实现
# master传递给父类 Frame 使用后,子类中再定义一个 master 对象
self.current_name=''
self.data={}
self.conf=load_config()
self.save_path=self.conf['conf']['文件路径'].strip()
self.default_type=self.conf['conf']['默认类型'].strip()
self.data=self.load_data()
self.load_list_box()
def createWidget(self):
'''创建组件'''
self.name=StringVar()
self.code=StringVar()
self.type=StringVar()
self.body=StringVar()
frame=Frame(self)
frame.pack(fill=BOTH,expand=True)
frame_left=Frame(frame)
frame_left.pack(side='left',fill=BOTH,expand=True)
self.list_box=Listbox(frame_left,selectmode=EXTENDED,width=50)
self.list_box.pack(fill=Y,expand=True)
self.list_box.bind('<<ListboxSelect>>',self.click_item)
frame_right=Frame(frame)
frame_right.pack(side='right',fill=BOTH,expand=True)
frame1=Frame(frame_right)
frame2=Frame(frame_right)
frame3=Frame(frame_right)
frame4=Frame(frame_right)
self.label_code=Label(frame2,text='代码')
self.label_msg = Label(frame1, text='名字')
self.label_type=Label(frame3,text='类型')
self.label_msg.pack(side='left')
self.label_code.pack(side='left')
self.label_type.pack(side='left')
self.enter_name=Entry(frame1,textvariable=self.name)
self.enter_code=Entry(frame2,textvariable=self.code)
self.enter_type=Entry(frame3,textvariable=self.type)
self.enter_body=Text(frame4,width=100,height=50)
self.enter_name.pack(fill=X)
self.enter_code.pack(fill=X)
self.enter_type.pack(fill=X)
self.enter_body.pack(fill=X)
frame2.pack(fill=X, side=TOP)
frame1.pack(fill=X, side=TOP)
frame3.pack(fill=X,side=TOP)
frame4.pack(fill=BOTH,side=TOP)
frame5=Frame(frame_right)
frame5.pack(fill=Y)
self.btn_add=Button(frame5,text='添加',width=10,command=self.add)
self.btn_del=Button(frame5,text='删除',width=10,command=self.delete)
self.btn_edit = Button(frame5, text='修改', width=10, command=self.edit)
self.btn_clear=Button(frame5,text='清空', width=10, command=self.clear)
self.btn_clear.pack(side='right')
self.btn_edit.pack(side='right')
self.btn_del.pack(side='right')
self.btn_add.pack(side='right')
def load_list_box(self):
self.list_box.delete(0,'end')
self.lst=list(self.data.keys())
for item in self.lst:
self.list_box.insert('end', '{}'.format(self.data[item]['prefix']))
self.save_data()
def save_data(self):
with open('data','wb') as f:
pickle.dump(self.data,f)
with open(self.save_path,'w',encoding='utf-8-sig') as f:
json.dump(self.data,f,ensure_ascii=False)
def load_data(self):
try:
with open('data','rb') as f:
return pickle.load(f)
except:
self.save_data()
return {}
def add(self):
name=self.name.get()
code=self.code.get()
type=self.type.get()
body=self.enter_body.get('0.0','end')
if all([name,code,body]):
if name in self.data.keys():
return self.show('错误', '名称已存在')
if code in [x['prefix'] for x in self.data.values()]:
return self.show('错误','代码已存在')
self.data[name] = {'prefix': code, 'scope': type if type.strip() else self.default_type , 'body': body, 'description': ''}
self.load_list_box()
def edit(self):
name = self.name.get()
code = self.code.get()
type = self.type.get()
body = self.enter_body.get('0.0', 'end')
if self.current_name!=name:
if name in self.data.keys():
return self.show('错误','名字重复')
if self.data[self.current_name]['prefix']!=code:
if code in [x['prefix'] for x in self.data.values()]:
return self.show('错误','代码重复')
self.data.pop(self.current_name)
if all([name, code, body]):
self.data[name] = {'prefix': code, 'scope': type if type.strip() else self.default_type,
'body': body, 'description': ''}
self.load_list_box()
def delete(self):
ids=self.list_box.curselection()
if ids:
for i in ids:
self.data.pop(self.lst[i])
self.load_list_box()
def clear(self):
self.name.set('')
self.code.set('')
self.type.set(self.default_type)
self.enter_body.delete('0.0','end')
self.current_name=''
def click_item(self,event):
ids=self.list_box.curselection()
if ids:
name=self.lst[ids[0]]
self.name.set(name)
item=self.data[name]
self.code.set(item['prefix'])
self.type.set(item['scope'])
self.enter_body.delete('0.0','end')
self.enter_body.insert('end',item['body'])
self.current_name=name
def show(self,title,msg):
messagebox.showinfo(str(title),str(msg))
def close(self):
self.save_data()
print('保存')
root.destroy()
if __name__ == '__main__':
root = Tk()
# 定义主窗口对象
#root.geometry("1000x500+200+300")
# 创建大小
root.title("Vscode代码片段管理器")
app = Application(master = root)
# 传递 master 参数为 主窗口对象
root.protocol('WM_DELETE_WINDOW', app.close)
root.mainloop()