单机游戏集合工具

单机游戏集合工具

		 初学Python写的一个单机游戏集合启动的小工具。

Main.py文件

import os
import threading
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkinter.filedialog import askopenfilename
from DoDatabase import *
from PIL import Image, ImageTk

class Main(object):
	"""docstring for Main"""
	def __init__(self):
		self.SW_Name='应用集合工具'
		self.V='1.0.0'
		if os.path.isfile('Games')==False:
			D=Database()
			D.Create_table()#创建数据表
			D.close()
			


	def fileOpenAsk(self):#选择文件对话框
		file = askopenfilename()
		return file
	def OpenFileToEntry(self,en):#选择文件路径,写到输入框中
		F=self.fileOpenAsk()
		en.set(F)

	def Start_(self,name,cb):#启动应用函数
		N = self.Select_(name.get())#根据应用名获取信息
		if os.path.isfile(N[0][1]):
			th=threading.Thread(target=lambda:os.popen(N[0][1]))
			th.setDaemon(True)#守护线程
			th.start()
		else:
			messagebox.showerror("启动失败","该应用未配置地址!\n或者未找到该地址!!")

		if cb.get():
			if os.path.isfile(N[0][2]):
				th2=threading.Thread(target=lambda:os.system(N[0][2]))
				th2.setDaemon(True)#守护线程
				th2.start()
			else:
				messagebox.showerror("启动失败","该应用未配置助手地址!\n或者未找到该地址!!")
		
		

	def SetListBoxView(self):
		D=Database()
		li = D.Select()#获取名字
		D.close()
		self.table_Frame.destroy()
		self.table_Frame=Frame(self.table_LFrame)
		self.table_Frame.pack(fill='both')
		Label(self.table_Frame,text='应用名字',bg='#c0f0cf').pack(fill='x')
		scrolly=Scrollbar(self.table_Frame,orient=VERTICAL)
		scrolly.pack(side=RIGHT,fill=Y)
		scrolly2=Scrollbar(self.table_Frame,orient=HORIZONTAL)
		scrolly2.pack(side=BOTTOM,fill=X)
		self.lb=Listbox(self.table_Frame,height=100,width=75)
		self.lb.pack(fill='both')
		self.lb.bind('<ButtonRelease-1>',self.Select)#绑定单击事件
		self.lb.bind('<Up>',self.Select)#绑定上键事件
		self.lb.bind('<Down>',self.Select)#绑定下键事件
		self.lb['yscrollcommand']=scrolly.set#垂直滚动条绑定
		self.lb['xscrollcommand']=scrolly2.set#水平滚动条绑定
		scrolly.config(command=self.lb.yview)
		scrolly2.config(command=self.lb.xview)
		p=0
		for x in li:
			p+=1;self.lb.insert(END,x[0])
			if p%2==0:#每隔一行换个颜色
				self.lb.itemconfig(p-1,bg='#c4f5e4')
			else:
				self.lb.itemconfig(p-1,bg='#e7fbf4')

	def Gui(self):
		self.win=Tk()
		self.win.title(self.SW_Name)
		self.win.rowconfigure(0, weight=1)
		self.win.columnconfigure(0, weight=1)
		width=722;height=550
		scwidth=self.win.winfo_screenwidth()#把窗口放到屏幕中间
		scheight=self.win.winfo_screenheight()
		cen = '%dx%d+%d+%d'%(width,height,(scwidth-width)/2,(scheight-height)/2-20)
		self.win.geometry(cen)
		#================菜单栏Start===================================================
		menubar=Menu(self.win)
		fmenu1=Menu(menubar);fmenu2=Menu(menubar);fmenu3=Menu(menubar)
		menubar.add_cascade(label="文件",menu=fmenu1)
		menubar.add_cascade(label="设置",menu=fmenu2)
		menubar.add_cascade(label="帮助",menu=fmenu3)
		fmenu1.add_command(label="退出",command=lambda:self.win.destroy())
		fmenu2.add_command(label="添加应用",command=self.add_game)
		fmenu3.add_command(label="关于",command=self.test)
		self.win['menu']=menubar
		#================菜单栏END===================================================
		self.win.grid_columnconfigure(0,weight=1)
		self.win.grid_columnconfigure(1,weight=1)
		list_area=Frame(self.win,bg='green')#======列表区域
		list_area.grid(row=0,column=0,sticky='nesw',padx=4,pady=4)
		message_area=Frame(self.win,bg='#FFF')#======信息区域
		message_area.grid(row=0,column=1,sticky='nesw',padx=4,pady=4)
		self.table_LFrame=LabelFrame(list_area,text='列表')#列表内容框
		self.table_LFrame.pack(fill='both')
		message_Frame=LabelFrame(message_area,text='功能',padx=2)#信息、功能内容框
		message_Frame.pack(fill='both')
		self.table_Frame=Frame(self.table_LFrame)
		self.table_Frame.pack(fill='both')
		#==================================样式区
		self.status=IntVar()#初始化助手是否选中
		self.set_NameVar=StringVar()#初始化Label的内容
		style = ttk.Style()#样式对象
		style.configure("BW.TLabel",foreground="#220063",background='#e7fbf4', font=("標楷體", "20",'bold'))#label样式
		style.configure("Bold.TButton",foreground="#220063",font=('標楷體','15','bold'))#按钮样式
		#===================================第一层
		F=Frame(message_Frame)
		F.pack(fill='both',pady=10)
		Label(F,text='应用名:').pack(side='left')
		L=LabelFrame(F,bg='#e7fbf4')
		L.pack(fill='x')
		ttk.Label(L,textvariable=self.set_NameVar,style='BW.TLabel').pack(padx=10)
		self.set_NameVar.set('请先选择应用')
		#===================================第二层
		F2=Frame(message_Frame)
		F2.pack(fill='both')
		cb=Checkbutton(F2,variable=self.status,text='是否启动助手').pack(side='left')
		Button(F2,text='配置',command=self.Set_item_gui).pack(side='right',padx=2)
		#===================================第三层
		F3=Frame(message_Frame)
		F3.pack(fill='both',pady=5)
		self.message_text = Text(F3,height=10)
		self.message_text.pack(fill='x')
		try:
			im = Image.open('bg.png')
		except Exception as e:
			messagebox.showerror("提示","丢失文件!!!(bg.png)")
		image = ImageTk.PhotoImage(im)
		ttk.Button(F3,text="\n开始\n",width=10,style='Bold.TButton',command=lambda:self.Start_(self.set_NameVar,self.status)).pack(fill='x')
		lbPic = Label(F3,text='aa',bg='#c4f5e4',width=400,image = image)
		def changesize(event):
			image = ImageTk.PhotoImage(im.resize((event.width,event.height),Image.ANTIALIAS))
			lbPic['image']=image
			lbPic.image=image
		lbPic.bind('<Configure>',changesize)
		lbPic.pack(fill='both',expand=1)
		self.SetListBoxView()#刷新列表
		self.win.mainloop()
		
	

	def Select(self,event):#获取应用信息,写入功能页
		name=self.lb.get(self.lb.curselection())#获取选取中的应用名
		D=Database()
		N=D.Condition_Select(name)#获取该应用的信息
		D.close()
		self.set_NameVar.set(N[0][0])#写入应用名到功能页
		self.message_text.delete('0.0',END)
		self.message_text.insert(END,N[0][-1])#写入详细信息到功能页
	def Select_(self,name):#根据应用名获取应用信息
		D=Database()
		N=D.Condition_Select(name)#获取该应用的信息
		D.close()
		return N

	def save_(self):#添加应用,保存动作函数
		T = self.text.get('1.0',END)
		if self.nameVar.get()!='' and self.pathVar.get()!='':#应用名和应用路径不能为空
			D=Database()
			D.Insert(self.nameVar.get(),self.pathVar.get(),self.helperpathVar.get(),T)
			D.close()
			messagebox.showinfo("提示","保存完成!")
			self.SetListBoxView()
			self.nameVar.set('')#清空输入框
			self.pathVar.set('')#清空输入框
			self.helperpathVar.set('')#清空输入框
			self.text.delete('0.0',END)#清空文本域
		else:
			messagebox.showerror("提示","应用名和应用路径不能为空!!!")
	def delete_(self,name,tl):#删除应用信息函数
		y = messagebox.askokcancel('提示', '确认删除?')
		if y:
			D=Database()
			D.Delete(name)
			D.close()
			messagebox.showinfo("提示","删除%s完成"%name)
			self.SetListBoxView()#刷新列表
			tl.destroy()#关闭窗口

	def update_(self,name,paths,helperpath,message,tl):#更新应用信息函数
		D=Database()
		D.Update(name,paths,helperpath,message)
		D.close()
		messagebox.showinfo("提示","更新%s完成"%name)
		self.SetListBoxView()#刷新列表
		tl.destroy()#关闭窗口


	def add_game(self):#添加应用窗口Gui
		if os.path.isfile('Games'):
			self.tl=Toplevel()
			self.tl.title('添加应用')
			width=522;height=350
			cen = '%dx%d+%d+%d'%(width,height,100,100)
			self.tl.geometry(cen)
			self.nameVar=StringVar();self.pathVar=StringVar()#应用名输入框值;应用地址输入框值
			self.helperpathVar=StringVar()#助手地址输入框值
			F_main=LabelFrame(self.tl,pady=10,padx=5)#最外面的容器框
			F_main.pack(fill='both',padx=5,pady=5)
			add_Frame=LabelFrame(F_main,text='添加应用',fg='blue',padx=10)#添加应用地址容器
			add_Frame.pack(fill='x')
			F=Frame(add_Frame)#不加这个容器,输入框就会超出内容容器
			F.pack(pady=5)
			ttk.Button(F,text='选择路径',command=lambda:self.OpenFileToEntry(self.pathVar)).grid(row=0,column=0)
			Entry(F,width=1000,textvariable=self.pathVar).grid(row=0,column=1,padx=10,pady=5)
			Label(F,text='应用名:',fg='green').grid(row=1,column=0,sticky=E)
			Entry(F,width=1000,textvariable=self.nameVar).grid(row=1,column=1,padx=10,pady=5)
			addhelper_Frame=LabelFrame(F_main,text='添加助手',fg='blue',padx=10)#添加游戏助手容器
			addhelper_Frame.pack(fill='x')
			F2=Frame(addhelper_Frame)#不加这个容器,输入框就会超出内容容器
			F2.pack(pady=5)
			ttk.Button(F2,text='选择路径',command=lambda:self.OpenFileToEntry(self.helperpathVar)).grid(row=1,column=0)
			Entry(F2,width=1000,textvariable=self.helperpathVar).grid(row=1,column=1,padx=10,pady=5)
			addmessage_Frame=LabelFrame(F_main,text='添加信息',fg='blue',padx=10,pady=5)#添加信息容器
			addmessage_Frame.pack(fill='x')
			self.text=Text(addmessage_Frame,height=8)
			self.text.pack(fill='both')
			Button(F_main,text='保存',width=10,bg='#3ee870',command=self.save_).pack()
		else:
			pd = messagebox.askyesno("提示","未找到数据文件,是否重新创建?")
			if pd:
				D=Database()
				D.Create_table()
				D.close()
				messagebox.showinfo("提示","创建完成!\n请重新添加!")
		
	def Set_item_gui(self):#选项设置GUI
		if self.set_NameVar.get()!='请先选择应用':
			tl=Toplevel()
			tl.title('配置')
			width=322;height=350
			cen = '%dx%d+%d+%d'%(width,height,100,100)
			tl.geometry(cen)
			LF=LabelFrame(tl,pady=10)
			LF.pack(fill='both',pady=10,padx=10)
			name=StringVar();path=StringVar();helperpath=StringVar()#初始化应用名、地址、助手地址
			Label(LF,text='应用名:').grid(row=0,column=0)
			Entry(LF,textvariable=name,fg='blue',state='readonly').grid(row=0,column=1)
			Label(LF,text='地址:').grid(row=1,column=0)
			Entry(LF,textvariable=path,fg='blue').grid(row=1,column=1)
			Label(LF,text='助手地址:').grid(row=2,column=0)
			Entry(LF,textvariable=helperpath,fg='blue').grid(row=2,column=1)
			Label(LF,text='信息:').grid(row=3,column=0)
			text=Text(LF,width=31,height=10)
			text.grid(row=3,column=1)
			N = self.Select_(self.set_NameVar.get())#根据应用名获取信息
			name.set(N[0][0]);path.set(N[0][1]);helperpath.set(N[0][2])
			text.insert(END,N[0][3])
			Button(tl,text='删除该项',bg='#fb8d96',command=lambda:self.delete_(N[0][0],tl)).pack(fill='x',padx=10)
			xg = Button(tl,text='修改该项',bg='#a8ffa3',command=lambda:self.update_(name.get(),path.get(),helperpath.get(),text.get('1.0',END),tl))
			xg.pack(fill='x',padx=10,pady=10)
			
	def test(self):
		messagebox.showinfo('提示','该页正在开发')

if __name__ == '__main__':
	M=Main()
	M.Gui()
		

DoDatabase.py文件

import sqlite3

class Database(object):
	def __init__(self):
		self.conn = sqlite3.connect('Games')
		self.c = self.conn.cursor()
	def Create_table(self):#建立表格动作
		self.c.execute('''CREATE TABLE COMPANY
	       (name CHAR(50) PRIMARY KEY     NOT NULL,
	       paths        CHAR(50),
	       helperpath        CHAR(50),
	       message        VARCHAR(255));''')
		self.conn.commit()

	def Insert(self,name,path,helperpath,message):#插入动作
		data=name,path,helperpath,message
		sql="INSERT INTO COMPANY (name,paths,helperpath,message)VALUES (?,?,?,?);"
		self.c.execute(sql,(name,path,helperpath,message))
		self.conn.commit()

	def Select(self):#查询动作
		lists=[]
		cursor = self.c.execute("SELECT * from COMPANY;")#name,paths,helper,helppath,message
		for x in cursor:
			lists.append(x)
		return lists

	def Condition_Select(self,con):
		lists=[]
		sql="SELECT * from COMPANY where name=(?);"
		cursor = self.c.execute(sql,(con,))
		result= cursor.fetchall()
		for i in result:
			lists.append(i)
		return lists

	def Update(self,name,paths,helperpath,message):#name,paths,helperpath,message
		print (name,paths,helperpath,message)
		sql = """UPDATE COMPANY SET paths = ?,
							 		helperpath = ?,
							 		message = ? WHERE name = ?;"""
		self.c.execute(sql,(paths,helperpath,message,name,))
		self.conn.commit()

	def Delete(self,name):
		sql = "DELETE from COMPANY where name = (?);"
		self.c.execute(sql,(name,))
		self.conn.commit()

	def close(self):
		self.conn.close()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只为你开心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值