初学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)
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
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( )
style = ttk. Style( )
style. configure( "BW.TLabel" , foreground= "#220063" , background= '#e7fbf4' , font= ( "標楷體" , "20" , 'bold' ) )
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) :
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) :
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;" )
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) :
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( )