最近学了wxPYTHON,这次就做了一个工具箱软件练手,软件主要是包含各种小工具,目前想到的有密码管理器,日记本,记账本,今天还看到一个网页浏览器,也可能加进来。目前实现的是密码管理器

软件GUI部分纯用wxPYTHON实现,数据库管理用到了sqlite3库和shelve库

软件流程主要包括一个启动画面,一个登陆对话框,和一个主界面了。

启动画面目前比较简单,就是一张图片;

(数据库对应文件:loginsql.py)登录对话框,登录对话框实现了密码登录和注册功能,后面并实现了软件的多用户使用,用户之间数据分离,这里用到了sqlite3数据库来管理:

(对应文件:mainfunc.py)主界面,由于目前还没想到在菜单栏,工具栏和状态栏放什么东西就只是简单实现了一下,

(对应index.py)用户主窗口包括了主页,目前由于不知放啥好,放了张图片,加一个电子时钟:

(对应文件:Keymanager.py)其他实现了各种小工具,由于是模块化管理,各工具之间并没有什么关系,后面添加新的工具比较简单,

目前第一个是密码管理器,这里与前面的登录用户是一一对应的,使用的是shelve库来管理数据,其实这个代码写的比较烂,有很多可以改进的地方:

代码mainfunc.py:

#-*- coding=utf-8 -*-
import wx
import wx.lib.buttons as buttons
from database import loginsql
from modules import Dairy
from modules import Keymanager
from modules import index value=0
string='' #主框架
class newframe(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,u'LOMO工具箱',size=(1200,955),pos=(350,20))
self.SetMinSize((1200,955))
self.SetMaxSize((1200,955))
self.splitterwindow()
self.statusbar()
self.initindex(None)
self.cursorinit()
self.menubar()
self.toolbar()
self.panel1buttonadd()
self.panel1buttonbind()
#分割窗口
def splitterwindow(self):
self.sp=wx.SplitterWindow(self,style=wx.SP_LIVE_UPDATE)
self.panel1=wx.Panel(self.sp,-1,style=wx.SUNKEN_BORDER)
self.panel2=wx.Panel(self.sp,-1)
self.panel1.SetBackgroundColour('sky blue')
self.panel2.SetBackgroundColour('AQUAMARINE')
self.sp.SplitVertically(self.panel1,self.panel2,150)
self.sp.SetMinimumPaneSize(150)
#状态栏
def statusbar(self):
self.statusbar=self.CreateStatusBar()
self.statusbar.SetFieldsCount(3)
self.panel2.Bind(wx.EVT_MOTION, self.OnMotion)
#工具栏
def toolbar(self):
self.toolbar=self.CreateToolBar()
#状态栏坐标显示
def OnMotion(self,event):
self.statusbar.SetStatusText(u'光标坐标: '+str(event.GetPositionTuple()),1)
#菜单栏
def menubar(self):
menubar=wx.MenuBar()
menu1=wx.Menu()
menu2=wx.Menu()
menu3=wx.Menu()
menubar.Append(menu1,u'文件')
menubar.Append(menu2,u'设置')
menubar.Append(menu3,u'退出')
self.SetMenuBar(menubar)
#panel1按钮数据
def buttondata(self):
return [['./pic/homepage.png',u'主页'],
['./pic/lock.png',u'个人人密码管理助手'],
['./pic/diary.png',u'日记每一天']]
#panel1按钮创建
def buttoncreate(self,index):
pic=wx.Image(self.buttondata()[index][0],wx.BITMAP_TYPE_PNG).Scale(80,80).ConvertToBitmap()
self.button=buttons.GenBitmapButton(self.panel1,-1,pic,size=(150,120))
self.button.SetBezelWidth(7)
self.button.SetBackgroundColour('CORAL')
self.button.SetToolTipString(self.buttondata()[index][1])
return self.button
#panel1按钮添加
def panel1buttonadd(self):
self.button1=self.buttoncreate(0)
self.button2=self.buttoncreate(1)
self.button3=self.buttoncreate(2)
sizer = wx.FlexGridSizer( rows=0,cols=1, hgap=5, vgap=5)
sizer.Add(self.button1,0,wx.EXPAND)
sizer.Add(self.button2,0,wx.EXPAND)
sizer.Add(self.button3,0,wx.EXPAND)
sizer.AddGrowableCol(0, proportion=1)
sizer.Layout()
self.panel1.SetSizer(sizer)
self.panel1.Fit()
#按钮事件绑定
def panel1buttonbind(self):
self.Bind(wx.EVT_BUTTON,self.initindex,self.button1)
self.Bind(wx.EVT_BUTTON,self.KEYhandler,self.button2)
self.Bind(wx.EVT_BUTTON,self.RIJIhandler,self.button3)
#自定义光标
def cursorinit(self):
cursorpic=wx.Image('./pic/cursor.png',wx.BITMAP_TYPE_PNG)
self.cursor=wx.CursorFromImage(cursorpic)
self.SetCursor(self.cursor)
#主页按钮事件
def initindex(self,event):
self.statusbar.SetStatusText(u'欢迎使用LOMO工具箱!',0)
self.Shutdowntimer()
self.index=index.indexinit(self.panel2)
#密码本按钮事件
def KEYhandler(self,event):
global string
self.Shutdowntimer()
self.statusbar.SetStatusText(u'这是我的密码本,嘿嘿',0)
temp=Keymanager.Keyinit(self.panel2,string)
#日记本按钮事件
def RIJIhandler(self,event):
global string
self.Shutdowntimer()
self.statusbar.SetStatusText(u'日记本不能偷看啊!!!',0)
Dairy.dairyinit(self.panel2,string)
#关闭index定时器
def Shutdowntimer(self):
try:
self.index.timer.Stop()
del self.index.timer
except:
pass #启动画面
def splashscreen():
P1=wx.Image('./pic/splashscreen.png',type=wx.BITMAP_TYPE_PNG).ConvertToBitmap()
wx.SplashScreen(P1,wx.SPLASH_CENTER_ON_SCREEN|wx.SPLASH_TIMEOUT,1000,None,-1) #登录对话框
class MyDialog(wx.Dialog):
def __init__(self):
text=u'欢迎使用LOMO工具箱!'
wx.Dialog.__init__(self,None,-1,u'登录/注册',pos=(750,330))
#对话框部件设置
self.SetBackgroundColour('CORAL')
texts=wx.StaticText(self,-1,text)
name=wx.StaticText(self,-1,u'用户名')
password=wx.StaticText(self,-1,u'密码')
self.namet=wx.TextCtrl(self)
self.passwordt=wx.TextCtrl(self,style=wx.TE_PASSWORD)
self.namet.SetBackgroundColour('white')
self.passwordt.SetBackgroundColour('white')
self.blank=wx.StaticText(self,-1,'')
login=wx.Button(self,id=-1,label=u'登录')
sign=wx.Button(self,id=-1,label=u'注册')
login.SetBackgroundColour('sky blue')
sign.SetBackgroundColour('sky blue')
fgs=wx.FlexGridSizer(2,2,5,5)
fgs.Add(name, 0, wx.ALIGN_RIGHT)
fgs.Add(self.namet, 0, wx.EXPAND)
fgs.Add(password, 0, wx.ALIGN_RIGHT)
fgs.Add(self.passwordt, 0, wx.EXPAND)
fgs.AddGrowableCol(1)
#sizer设置
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(texts,0,wx.ALL,5)
sizer.Add(wx.StaticLine(self), 0, wx.EXPAND|wx.ALL, 5)
sizer.Add(fgs, 0, wx.EXPAND|wx.ALL, 5)
sizer.Add(self.blank,0,wx.ALIGN_CENTER, 5)
sizer.Add(login, 0, wx.EXPAND|wx.ALL, 5)
sizer.Add(sign, 0, wx.EXPAND|wx.ALL, 5)
self.SetSizer(sizer)
#按钮绑定
self.Bind(wx.EVT_BUTTON,self.loginhandler,login)
self.Bind(wx.EVT_BUTTON,self.signhandler,sign)
self.Bind(wx.EVT_CLOSE, self.OnCloseMe)
#登录事件
def loginhandler(self,event):
global value,string
final=loginsql.check(self.namet.GetValue(),self.passwordt.GetValue())
if(not final):
self.blank.SetLabelText(u'用户名或密码错误')
else:
string=self.namet.GetValue()
self.Close(True)
value=0
event.Skip()
#注册事件
def signhandler(self,event):
returns=loginsql.insert(self.namet.GetValue(),self.passwordt.GetValue())
if returns:
self.blank.SetLabelText(u'用户名或密码不能为空')
#关闭事件
def OnCloseMe(self, event):
global value
value=1
self.Close(True)
event.Skip() if __name__ == '__main__':
newapp=wx.App(False)
#启动画面
splashscreen()
#登录对话框
dlg=MyDialog()
dlg.ShowModal()
dlg.Destroy()
if value:
exit()
#主框架
frame=newframe()
frame.Show()
newapp.MainLoop()

  代码index.py

#-*- coding:utf-8 -*-
import wx
import wx.lib.buttons as buttons
import time
import wx.gizmos as gizmos class indexinit():
def __init__(self,panel2):
self.panel2=panel2
self.initpanel2(None)
#初始化
def initpanel2(self,event):
self.panel2.DestroyChildren()
self.panelpic=wx.Image('./pic/panel.jpg',wx.BITMAP_TYPE_JPEG,).Scale(1050,955).ConvertToBitmap()
self.picbk=wx.StaticBitmap(parent=self.panel2,pos=(0,0),bitmap=self.panelpic)
self.LEDinit()
#LED显示器
def LEDinit(self):
led = gizmos.LEDNumberCtrl(self.picbk, -1, (700,30), (250, 50),gizmos.LED_ALIGN_CENTER)#| gizmos.LED_DRAW_FADED)
led.SetForegroundColour('black')
led.SetBackgroundColour('yellow green')
self.clock = led
self.OnTimer(None)
self.timer = wx.Timer()
self.timer.Start(1000)
self.timer.Bind(wx.EVT_TIMER, self.OnTimer)
#刷新器
def OnTimer(self, evt):
t = time.localtime(time.time())
st = time.strftime("%I-%M-%S", t)
self.clock.SetValue(st)

  代码:loginsql.py:

#-*- coding=utf-8 -*-
import sqlite3
import wx #登录检查
def check(name,password):
conn = sqlite3.connect('./data/user.db')
c = conn.cursor()
try:
passwordr=c.execute('SELECT password FROM USER WHERE username=? ',[(name)])
a=''
for i in passwordr:
a=str(i[0])
if(a==password and a is not ''):
return 1
else:
return 0
except sqlite3.OperationalError:
return 0
finally:
conn.close() #注册事件
def insert(name,password):
print name,password
if(name=='' or password==''):
return 1
conn=sqlite3.connect('./data/user.db')
c = conn.cursor()
c.execute('INSERT INTO USER (username,password) VALUES(?,?)',(name,password))
conn.commit()
conn.close()
return 0 #建表事件,用于测试
def create():
conn=sqlite3.connect('./data/user.db')
c = conn.cursor()
c.execute('CREATE TABLE USER (username VARCHAR PRIMARY KEY NOT NULL, password VARCHAR NOT NULL);')
conn.close() #删除事件,用于测试
def delete(name):
conn=sqlite3.connect('./data/user.db')
c = conn.cursor()
c.execute('DELETE FROM USER WHERE name=?',[(name)]) #查表事件,用于测试
def showtable():
conn=sqlite3.connect('./data/user.db')
c=conn.cursor()
passwordr=c.execute('''SELECT password,username FROM USER ''')
for i in passwordr:
print i[0],i[1]
conn.close()

  代码Keymanager.py:

#-*- coding=utf-8 -*-
import wx
import wx.grid
import shelve
import wx.lib.buttons as buttons class Keyinit():
def __init__(self,panel,string):
self.panel=panel
self.string=string.encode("ascii")
self.shelvefile(string)
panel.DestroyChildren ()
self.buttonadd()
self.buttonbind()
self.tableinit()
#表格初始化
def tableinit(self):
self.collabels=[u'项目名',u'用户名',u'密码',u'注释']
self.grid = wx.grid.Grid(parent=self.panel,id=-1,pos=wx.DefaultPosition,size=(1027,700),style=wx.WANTS_CHARS,)
self.grid.CreateGrid(45,4)
self.grid.SetColSize(1,200)
self.grid.SetDefaultColSize(230,True)
self.grid.SetDefaultRowSize(35,True)
self.grid.SetDefaultCellAlignment(wx.CENTRE, wx.CENTRE)
self.grid.SetDefaultCellTextColour('black')
self.grid.SetDefaultCellBackgroundColour('sky blue')
self.grid.SetDefaultCellFont(wx.Font(11,wx.SWISS,wx.NORMAL,wx.NORMAL))
for row in range(4):
self.grid.SetColLabelValue(row,self.collabels[row])
self.showtable()
#按钮数据
def buttondata(self):
return [['./pic/save.png',u'保存',(550,720)],
['./pic/plus.png',u'新建',(780,720)]]
#panel1按钮创建
def buttoncreate(self,index):
pic=wx.Image(self.buttondata()[index][0],wx.BITMAP_TYPE_PNG).Scale(65,65).ConvertToBitmap()
self.button=buttons.GenBitmapButton(self.panel,-1,pic,size=(90,90),pos=self.buttondata()[index][2])
self.button.SetBackgroundColour('CORAL')
self.button.SetToolTipString(self.buttondata()[index][1])
return self.button
#panel1按钮添加
def buttonadd(self):
self.button1=self.buttoncreate(0)
self.button2=self.buttoncreate(1)
#按钮事件绑定
def buttonbind(self):
self.button1.Bind(wx.EVT_BUTTON,self.savehandler)
self.button2.Bind(wx.EVT_BUTTON,self.newhandler)
#数据库查询
def shelvefile(self,string):
self.database=shelve.open('./data/database.dat')
try:
self.person=self.database[self.string]
except:
self.database[self.string]=[[None for i in range(4)] for j in range(45)]
#显示表
def showtable(self):
for row in range(len(self.database[self.string])):
for col in range(4):
temp=self.database[self.string][row][col]
if temp is not None:
self.grid.SetCellValue(row, col,'%s' % self.database[self.string][row][col])
else:
self.grid.SetCellValue(row, col,'')
self.grid.ForceRefresh()
#保存事件
def savehandler(self,event):
temp=self.database[self.string]
for i in range(self.grid.GetNumberRows()):
for j in range(self.grid.GetNumberCols()):
temp[i][j]=self.grid.GetCellValue(i,j)
self.database[self.string]=temp
self.showtable()
#新建事件
def newhandler(self,event):
self.grid.AppendRows(numRows=1)
self.grid.ForceRefresh()

  (未完待续。。。)

wxPYTHON图形化软件开发(一)---LOMO工具箱的更多相关文章

  1. Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  2. 安装Git和图形化软件[SouceTree跳过首次登陆]

    安装Git和图形化软件[SouceTree跳过首次登陆] 标签(空格分隔): 版本控制 安装GIT[客户端]: 下载:[https://git-scm.com/downloads/] 安装:[next ...

  3. Windows下搭建远程Linux主机的图形化本地开发环境

    在实际开发中,项目的类生产.生产环境一般都是选择Linux为服务器进行部署. 相应的,我们的开发最好也在Linux环境下进行,否则容易引发其他的问题,比如不同环境下功能不一致.库依赖差异等. 但是Li ...

  4. 【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll

    今天在安装了jetbrains官网上的ToolBox软件后,没有办法启动起来,报错如下: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll 尝试重新安装 ...

  5. Es图形化软件使用之ElasticSearch-head、Kibana,Elasticsearch之-倒排索引操作、映射管理、文档增删改查

    今日内容概要 ElasticSearch之-ElasticSearch-head ElasticSearch之-安装Kibana Elasticsearch之-倒排索引 Elasticsearch之- ...

  6. wxpython图形化界面编程(一):添加菜单,设置图片大小,添加文本框等,并简要布局

    #-*-encoding:utf-8-*-import wx def loadframe(): app = wx.App() mywindow = myframe() mywindow.Show() ...

  7. windows 安装 Mongodb 数据库及操作图形化软件 Robo 3T

    1 下载系统对应的正确 Mongodb 和 Robo 3T 版本 2 选中 Mongodb 需要安装的路径(后续会使用路径) 3 启动 Mongodb 服务器(到安装相关的路径) 可以参考 菜鸟教程 ...

  8. CentOS6.5配置python开发环境之一:CentOS图形化界面显示

    这两天在配置centos系统下python的开发环境和工具. 刚用centos,做做记录可以方便以后有需要的人...查资料确实挺麻烦的 centos6.5 sublime3 python27 subl ...

  9. Moviepy音视频开发:开发视频转gif动画或jpg图片exe图形化工具的案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

随机推荐

  1. HDMI之CEC DDC学习笔记(可能有误)

    1 HDMI的音视频通路,有待学习: 2 DDC通路,大致是个IIC接口,读取上游器件的EDID或者E-EDID数据: EDID的前128字节数据格式如下:(可能有不同版本,格式可能有区别)

  2. java 选择排序

    import java.util.Scanner; public class SelectionSort { public static void sort(int[] a, int n){ if(n ...

  3. Java8新特性——接口的默认方法和类方法

    Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只 ...

  4. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  5. Maven学习链接

    别人的资料很多且写的很详细,我这里先收藏,等学习到一定阶段且有时间再整理自己的积累. 1.eclipse安装maven插件方法: http://blog.csdn.net/kittyboy0001/a ...

  6. JBoss-7.1.1 http访问端口修改

    修改http服务端口 找到 jboss-as-7.1.1.Final/standalone/configuration/standalone.xml文件,找到第298行,如下图: 如果我们想改成80端 ...

  7. POJ 3414 Pots

    Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  8. struts下ajax提交与页面进行提示 返回值为null

    @Override    public String execute() throws Exception {        if ("none".equals(task)) {  ...

  9. winform 实现pdf浏览

    1.开发工具:VS2013 2.开发环境:win 10 64位 3.添加控件: 打开VS,点击工具箱--常规--右键--“选择项”---“Com组件”,选择Adobe PDF Reader控件(在这之 ...

  10. 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器

    在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...