找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3887|回复: 24

[代码与实例] 分享新鲜出炉的物料管理系统-新手上路,求大家指点,嘿...

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈 发表于 2016-7-26 17:34:52 | 显示全部楼层 |阅读模式
小弟刚学wxpython一个多月,结合工作需要,我写了一个小系统,管理库房的贵重物料,比如家里的CPU,内存等等(特别贵,没见过钱。。)。现在基本可以运行,废话不说,马上交货。求大家给出宝贵意见。(可以先看效果图噢)
Mainwindow.py:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
import MainMenu
from Scanwindow import Scandata
from Findwindow import finddata
import socket
__author__= "Panda Zhang"
__date__ = "$Jul 20, 2016 10:05:00 AM$"
COLOR_DARKGRAY = '#AAAAAA'
COLOR_ABORT = '#CD853F'
COLOR_PINK = '#FFC0CB'
class Mainwindow(wx.Frame):
    def __init__(self,):
        #wx.Frame.__init__(self,None,-1,'Rotation System',pos=(100,100))
        wx.Frame.__init__(self,None,-1,'Rotation System',size=(1070,900),pos=(100,100))
        self.SetIcon(wx.Icon('rotation.png',wx.BITMAP_TYPE_PNG))
        self.mainmenu=MainMenu.MainMenu(wx.MenuBar)
        self.SetMenuBar(self.mainmenu)
        self.boxv=wx.BoxSizer(wx.VERTICAL)
        self.bkg=wx.Panel(self)
        #self.bkg.SetBackgroundColour(COLOR_ABORT)
        self.word=wx.StaticText(self.bkg,-1,label='Rotation Control System')
        font = wx.Font(24,wx.DEFAULT,style=wx.ITALIC,weight=wx.BOLD )
        self.word.SetFont(font)
        self.scandata=Scandata(self.bkg)
        self.finddata=finddata(self.bkg)
        self.boxv.Add(self.word,proportion=0,flag=wx.ALIGN_CENTER|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM,border=10)
        self.boxv.Add(self.scandata,proportion=1,flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP,border=10)
        self.boxv.Add(self.finddata,proportion=1,flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP,border=10)
        self.statusbar=self.CreateStatusBar()
        self.statusbar.SetFieldsCount(3)
        self.statusbar.SetStatusWidths([-3,-2,-1])
        self.statusbar.SetStatusText(u"作者:Panda Zhang",2)
        self.bkg.SetSizerAndFit(self.boxv)
if __name__ == '__main__':
    app= wx.App()
    mainWindow = Mainwindow()
    mainWindow.Show()
    app.MainLoop()


MysqlConnection.py:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
from Uut import Uut
from Uut import Uut
import MySQLdb
CPUrotationtime=30
DIMMrotationtime=30
QLogicrotationtime=30
# class scandata:
#     def __init__(self,sernum='',dimmsn1='',dimmsn2='',dimmsn3='',dimmsn4='',
#     dimmsn5='',dimmsn6='',dimmsn7='',dimmsn8='',dimmsn9='',dimmsn10='',dimmsn11='',
#                  dimmsn12='',dimmsn13='',dimmsn14='',dimmsn15='',dimmsn16='',
#                  rectime=''):
#         self.sernum = sernum
#         self.dimmsn1 = dimmsn1
#         self.dimmsn2 = dimmsn2
#         self.dimmsn3 = dimmsn3
#         self.dimmsn4 = dimmsn4
#         self.dimmsn5 = dimmsn5
#         self.dimmsn6 = dimmsn6
#         self.dimmsn7 = dimmsn7
#         self.dimmsn8 = dimmsn8
#         self.dimmsn9 = dimmsn9
#         self.dimmsn10 = dimmsn10
#         self.dimmsn11 = dimmsn11
#         self.dimmsn12 = dimmsn12
#         self.dimmsn13 = dimmsn13
#         self.dimmsn14 = dimmsn14
#         self.dimmsn15 = dimmsn15
#         self.dimmsn16 = dimmsn16
#         self.rectime = rectime
#
#     def getSernum(self):
#         return self.sernum
# class faildata:
#     def __init__(self,sernum='',dimmsn1='',dimmsn2='',dimmsn3='',dimmsn4='',
#     dimmsn5='',dimmsn6='',dimmsn7='',dimmsn8='',dimmsn9='',dimmsn10='',dimmsn11='',
#                  dimmsn12='',dimmsn13='',dimmsn14='',dimmsn15='',dimmsn16='',
#                  testresult='',failitem=''):
#         self.failitem = failitem
#         self.count = 1
#         self.sernum = [sernum]
#         self.dimmsernum = [dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,
#                            dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,
#                            dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16]
class MysqlConnection:
    def __init__(self,host,usr,pwd,db='test',port=3306):
        self.host=host
        self.usr=usr
        self.pwd=pwd
        self.db=db
        self.port=port
        self.conn = None
        self.isConnected = False
        self.cursor = None
        self.uut = Uut()
    def connect(self):
        self.conn = MySQLdb.connect(host=self.host,port=self.port,user=self.usr,passwd=self.pwd,db=self.db)
        if self.conn != None:
            self.cursor = self.conn.cursor()
            self.creatDb()
            self.isConnected = True
            #print self.isConnected
        else:
            self.isConnected = False
    def setWarning(self,bool):
        if bool:
            self.cursor.execute("SET sql_notes = 0")
        else:
            self.cursor.execute("SET sql_notes = 1")
    def creatDb(self):
        self.setWarning(True)
        self.cursor.execute("CREATE TABLE IF NOT EXISTS rotate (\
            id INT PRIMARY KEY AUTO_INCREMENT,\
            sernum VARCHAR(25),\
            cpu1 VARCHAR (25),\
            cpu2 VARCHAR (25),\
            dimmsn1 VARCHAR(25),\
            dimmsn2 VARCHAR(25),\
            dimmsn3 VARCHAR(25),\
            dimmsn4 VARCHAR(25),\
            dimmsn5 VARCHAR(25),\
            dimmsn6 VARCHAR(25),\
            dimmsn7 VARCHAR(25),\
            dimmsn8 VARCHAR(25),\
            dimmsn9 VARCHAR(25),\
            dimmsn10 VARCHAR(25),\
            dimmsn11 VARCHAR(25),\
            dimmsn12 VARCHAR(25),\
            dimmsn13 VARCHAR(25),\
            dimmsn14 VARCHAR(25),\
            dimmsn15 VARCHAR(25),\
            dimmsn16 VARCHAR(25),\
            QLogic1 VARCHAR (25),\
            QLogic2 VARCHAR (25),\
            QLogic3 VARCHAR (25),\
            QLogic4 VARCHAR (25),\
            rectime DATETIME)")
        self.setWarning(False)
        self.conn.commit()
    def executeCmd(self,cmd):
        if not self.isConnected:
            return False
        self.cursor.execute(cmd)
        self.conn.commit()
        return True
    def RecordRotate(self,sernum):
        if not self.isConnected:
            return False
        #print sernum
        # self.databasetime=str(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time())))
        self.executeCmd("INSERT INTO rotate (sernum,cpu1,cpu2,dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,\
        dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16,QLogic1,QLogic2,QLogic3,QLogic4,rectime) VALUES \
                        ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',NOW())" %(
            sernum[0],
            sernum[1],
            sernum[2],
            sernum[3],
            sernum[4],
            sernum[5],
            sernum[6],
            sernum[7],
            sernum[8],
            sernum[9],
            sernum[10],
            sernum[11],
            sernum[12],
            sernum[13],
            sernum[14],
            sernum[15],
            sernum[16],
            sernum[17],
            sernum[18],
            sernum[19],
            sernum[20],
            sernum[21],
            sernum[22]))
        # self.executeCmd("INSERT INTO rotate sernum,dimmsn1 VALUES '%s','%s'" % (sernum[0],sernum[1]))
    def checkrotationrecord(self):
            return True
    def RotateFind(self,sernum):
        if not self.isConnected:
            return False
        count1 = self.cursor.execute("SELECT sernum,rectime from rotate where '%s' in (cpu1,cpu2,dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,\
                                    dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16,QLogic1,QLogic2,QLogic3,QLogic4);"%(sernum[0]))
        if count1 > 0:
            results = self.cursor.fetchmany(count1)
            for r in results:
                self.uut.recordlist.append('%s\t %s\t %s\t'%(sernum[0],str(r[0]),str(r[1])))
                self.uut.rectimelist.append(str(r[1]))
                # self.uut.binddimmlist.append(sernum[0])
                # self.uut.parentsn.append(str(r[0]))
                # self.uut.rectimelist.append(str(r[1]))
            self.uut.setrotatecount(count1)
            count2 = self.cursor.execute("SELECT TIMESTAMPDIFF (DAY,'%s','%s');"%(self.uut.rectimelist[0],self.uut.rectimelist[count1-1]))
            self.uut.setrotateday(count2)
        self.uut.setrecordlist(self.uut.recordlist)
    def close(self):
        if self.conn != None:
            self.cursor.close()
            self.conn.close()
            self.cursor = None
            self.conn = None
            self.isConnected = False

MainMenu.py:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
import re
class MainMenu(wx.MenuBar):
    def __init__(self,parentFrame,style=0):
        self.style=style
        self.parentFrame=parentFrame
#self.password=''
        wx.MenuBar.__init__(self)
        file = wx.Menu()
        file.Append(110,'&Open','Open a file') #Step1
        self.Append(file,'&文件') # Step2
        edit=wx.Menu()
        edit.Append(111,'&Cut','Cut stuff')
        self.Append(edit,'&編輯')
        tool=wx.Menu()
        config = wx.MenuItem(tool,501,'&Settings\tCtrl+S','Settings')
        self.Bind(wx.EVT_MENU,self.Password,config)
tool.AppendItem(config)
        self.Append(tool, '&工站')
        help=wx.Menu()
        help1=help.Append(113,'&系統info','Help Me')
self.Bind(wx.EVT_MENU,self.Rule,help1)
        self.Append(help,'&系統')
        #wx.EVT_MENU(self, 501, self.onSettings)

    #def onSettings(self,event):
        #pass
    def Rule(self, event):
        wx.MessageBox("1.CPU  recycle 20 times.\n2.DIMM recycle 30 times.\n3.Qligic recycle 20 times.")
    def Password(self,event):
        p3=re.compile(u'F[0-9]{7}')
        while True:
            dlg = wx.TextEntryDialog(self,'请输入密码:','账号登陆')
            if dlg.ShowModal()==wx.ID_OK:
                self.password = dlg.GetValue().upper()
                if p3.match(self.password) is None:
                    self.password = 'Cancel'
                    continue
                else:
                    dlg.Destroy()
                    break
            else:
                self.password = 'Cancel'
                dlg.Destroy()
                break
        return self.password

Findwindow.py:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
import MySQLdb
from MysqlConnection import MysqlConnection
from Uut import Uut

COLOR_DARKGRAY = '#AAAAAA'
COLOR_ABORT = '#CD853F'
COLOR_PINK = '#FFC0CB'
COLOR_AAA ='#EAEAAD'
typelist=['主板SN','內存條SN']
Loop=True

class finddata(wx.Window):
    def __init__(self,parent,):
        wx.Window.__init__(self,parent)
        self.bkg=wx.Panel(self,style=wx.SIMPLE_BORDER)
        self.datalist=[]
        self.OP_ID=''
        self.uut = Uut()#kobe
        self.uut.setsernum('')#kobe
        self.mc = MysqlConnection('localhost','admin','admin')#kobe
        self.bkg.SetBackgroundColour(COLOR_AAA)
        self.datainput=wx.StaticText(self.bkg,-1,label='查詢SN:',style=wx.ALIGN_CENTER)
        self.datascan=wx.TextCtrl(self.bkg,style=wx.TE_PROCESS_ENTER,size = (150,25))
        self.datascan.SetOwnBackgroundColour('Green')
        self.datascan.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
        #self.Bind(wx.EVT_TEXT,self.getscaninfo,self.datascan)

        self.boxh1=wx.BoxSizer()
        self.boxv3=wx.BoxSizer(wx.VERTICAL)
        self.boxh1.Add(self.datainput,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxh1.Add(self.datascan,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxv3.AddSpacer(20)
        self.boxv3.Add(self.boxh1,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)

        self.boxv2=wx.BoxSizer(wx.VERTICAL)
        self.findtitle=wx.StaticText(self.bkg,-1,label='查詢記錄:',style=wx.ALIGN_CENTER)
        self.findtext=wx.TextCtrl(self.bkg,style=wx.TE_MULTILINE|wx.TE_READONLY,size = (780,190))
        self.bkg.SetBackgroundColour(COLOR_AAA)
        self.findtext.SetBackgroundColour(COLOR_DARKGRAY)
        self.boxv2.Add(self.findtitle,proportion=0,flag=wx.ALIGN_LEFT,border=5)
        self.boxv2.Add(self.findtext,proportion=1,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxh=wx.BoxSizer()
        self.boxh.Add(self.boxv3,proportion=0,flag=wx.ALIGN_LEFT,border=5)
        self.boxh.Add(self.boxv2,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
        self.bkg.SetSizerAndFit(self.boxh)
    def onstart(self,evt):
        pass
    def setmessagedata(self,label):
        if '\n\r' in label:
            self.findtext.AppendText(label)
        else:
            self.findtext.AppendText(label+'\n')
    def onKeyDown(self,event):
        self.currenttime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        kc=event.GetKeyCode()
        if (kc==13 or kc == 370):
            # print self.datascan.GetValue()
            self.datalist.append(self.datascan.GetValue())
            if self.datalist != []:
                # print self.datalist
                #liststr='[' + self.currenttime + ']' + self.datascan.GetValue()
                self.mc.connect()#kobe
                self.mc.RotateFind(self.datalist)#kobe
                # liststr = '[' + self.currenttime + '] ' + self.datascan.GetValue() + '����ϸ��Ϣ��'
                self.setmessagedata(label='======================================================================')
                liststr = '[' + self.datascan.GetValue() + ']' + 'Rotate Record:'
                self.setmessagedata(label=liststr)
                liststr = '物料SN\t'.center(24) + '主板SN\t'.center(30) + '绑定时间\t'.center(10)
                self.setmessagedata(label=liststr)
                if len(self.mc.uut.recordlist) != 0:
                    self.setmessagedata(label='-----------------------------------------------------------------------------------')
                    for i in range (self.mc.uut.getrotatecount()):
                        liststr = self.mc.uut.getrecordlist()[i]
                        self.setmessagedata(label=liststr)
                    self.setmessagedata(label='--------------------------------------')
                    liststr = 'Rotate次数:\t%d\t次'%self.mc.uut.getrotatecount() + '\n' + 'Roate天数:\t%d\t天'%self.mc.uut.getrotateday() + '(%s ~ %s)'%(self.mc.uut.rectimelist[0],self.mc.uut.rectimelist[self.mc.uut.getrotatecount()-1])
                    self.setmessagedata(label=liststr)
                    self.setmessagedata(label='======================================================================')
                else:
                    self.setmessagedata(label='-----------------------------------------------------------------------------------')
                    liststr = '无绑定记录'.center(100)
                    # self.findtext.SetDefaultStyle(wx.TextAttr('RED'))
                    self.setmessagedata(label=liststr)
                    self.setmessagedata(label='======================================================================')
            self.mc.uut.recordlist=[]
            self.datalist=[]
            self.datascan.Clear()
        event.Skip()
    def getSN(self):
        print self.datascan.GetValue()
    def RecordSN(self):
        pass

Scanwindow.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
from MysqlConnection import MysqlConnection
from Uut import Uut
import re
import wx.combo

COLOR_DARKGRAY = '#AAAAAA'
COLOR_ABORT = '#CD853F'
COLOR_PINK = '#FFC0CB'
COLOR_AAA ='#EAEAAD'
typelist=['主板SN','CPU SN','內存條SN','QLogic網卡SN']
Loop=True

class Scandata(wx.Window):
    def __init__(self,parent,):
        wx.Window.__init__(self,parent)
        self.bkg=wx.Panel(self,style=wx.SIMPLE_BORDER)
        self.datalist=[]
        self.OP_ID=''
        self.uut = Uut()#kobe
        self.uut.setsernum('')#kobe
        self.samplelist=['PSU','NVRAM','MB']
        self.mc = MysqlConnection('localhost','admin','admin')#kobe
        self.bkg.SetBackgroundColour(COLOR_AAA)
        self.materialtype=wx.StaticText(self.bkg,-1,label='物料類型:',style=wx.ALIGN_CENTER)
        self.materialdata=wx.TextCtrl(self.bkg,-1,style=wx.TE_READONLY,size = (150,25))
        self.materialdata.SetBackgroundColour(COLOR_DARKGRAY)
        self.materialdata.Disable()
        self.datainput=wx.StaticText(self.bkg,-1,label='數據掃描:',style=wx.ALIGN_CENTER)
        self.datascan=wx.TextCtrl(self.bkg,style=wx.TE_PROCESS_ENTER,size = (150,25))
        self.datascan.SetOwnBackgroundColour(COLOR_DARKGRAY)
        self.datascan.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
        self.datascan.Disable()
        #self.Bind(wx.EVT_TEXT,self.getscaninfo,self.datascan)
        self.startbutton=wx.Button(self.bkg,-1,label='開始',size=(85, 30))
        self.stopbutton=wx.Button(self.bkg,-1,label='停止ֹ',size=(85,30))
        self.Bind(wx.EVT_BUTTON,self.onstart,self.startbutton)
        self.Bind(wx.EVT_BUTTON,self.onstop,self.stopbutton)
        #self.stopbutton.SetBackgroundColour(COLOR_DARKGRAY)
        self.stopbutton.Disable()
        self.tesample=wx.StaticText(self.bkg,-1,label='TE Sample:',style=wx.ALIGN_CENTER)
        self.tesampleselect =wx.Choice(self.bkg,-1,size=(85,30),choices=self.samplelist)
        self.tesampleselect.SetStringSelection(self.samplelist[0])
        self.sampleinput=wx.StaticText(self.bkg,-1,label='資料錄入:',style=wx.ALIGN_CENTER)
        self.samplescan=wx.TextCtrl(self.bkg,style=wx.TE_PROCESS_ENTER,size = (150,25))
        self.samplescan.SetOwnBackgroundColour('Green')
        self.samplescan.Bind(wx.EVT_KEY_DOWN, self.samplescankeydown)
        self.boxh1=wx.BoxSizer()
        self.boxh1.Add(self.materialtype,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT|wx.TOP,border=5)
        self.boxh1.Add(self.materialdata,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT|wx.TOP,border=5)
        self.boxh2=wx.BoxSizer()
        self.boxh2.Add(self.datainput,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT,border=5)
        self.boxh2.Add(self.datascan,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT,border=5)
        self.boxh3=wx.BoxSizer()
        self.boxh3.Add(self.startbutton,proportion=0,flag=wx.ALIGN_CENTER,border=5)
        self.boxh3.Add(self.stopbutton,proportion=0,flag=wx.ALIGN_CENTER,border=5)
        self.boxh4=wx.BoxSizer()
        self.boxh4.Add(self.tesample,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT|wx.TOP,border=5)
        self.boxh4.Add(self.tesampleselect,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT|wx.TOP,border=5)
        self.boxh5=wx.BoxSizer()
        self.boxh5.Add(self.sampleinput,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT,border=5)
        self.boxh5.Add(self.samplescan,proportion=0,flag=wx.ALIGN_LEFT|wx.LEFT|wx.RIGHT,border=5)
        self.boxv1=wx.BoxSizer(wx.VERTICAL)
        self.boxv1.AddSpacer(10)
        self.boxv1.Add(self.boxh1,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxv1.Add(self.boxh2,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxv1.Add(self.boxh3,proportion=0,flag=wx.ALIGN_CENTER|wx.ALL,border=5)
        self.boxv1.AddSpacer(30)
        self.boxv1.Add(self.boxh4,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxv1.Add(self.boxh5,proportion=0,flag=wx.ALIGN_LEFT|wx.ALL,border=5)
        self.boxv2=wx.BoxSizer(wx.VERTICAL)
        self.messagetitle=wx.StaticText(self.bkg,-1,label='掃描記錄:',style=wx.ALIGN_CENTER)
        self.messagetext=wx.TextCtrl(self.bkg,style=wx.TE_MULTILINE|wx.TE_READONLY,size = (780,230))
        self.bkg.SetBackgroundColour(COLOR_AAA)
        self.messagetext.SetBackgroundColour(COLOR_DARKGRAY)
        self.boxv2.Add(self.messagetitle,proportion=0,flag=wx.ALIGN_LEFT,border=5)
        self.boxv2.Add(self.messagetext,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
        self.boxh=wx.BoxSizer()
        self.boxh.Add(self.boxv1,proportion=0,flag=wx.ALIGN_LEFT,border=5)
        self.boxh.Add(self.boxv2,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
        self.bkg.SetSizerAndFit(self.boxh)
    def onstart(self,evt):
        self.scanID()
        print '11'
        if self.OP_ID != 'Cancel':
            self.materialdata.Enable()
            font = wx.Font(15,wx.DEFAULT,style=wx.NORMAL,weight=wx.NORMAL)
            self.materialdata.SetOwnBackgroundColour('Green')
            self.materialdata.SetFont(font)
            self.datascan.Enable()
            self.datascan.SetBackgroundColour('Green')
            if len(self.datalist)==0:
                self.setmaterialdata(label=typelist[0])
            #self.startbutton.SetBackgroundColour(COLOR_DARKGRAY)
            self.startbutton.Disable()
            self.stopbutton.Enable()

    def onstop(self,evt):
        self.materialdata.SetOwnBackgroundColour(COLOR_DARKGRAY)
        self.materialdata.Clear()
        self.materialdata.Disable()
        self.datascan.SetBackgroundColour(COLOR_DARKGRAY)
        self.datascan.Disable()
        self.datalist=[]
        self.datascan.Clear()
        self.startbutton.Enable()
        self.stopbutton.Disable()
    def scanID(self):
        p3=re.compile(u'F[0-9]{7}')
        #self.SetBackgroundColour('yellow')
        while True:
            dlg = wx.TextEntryDialog(self,'掃描您的工號:','工號錄入')
            if dlg.ShowModal()==wx.ID_OK:
                self.OP_ID = dlg.GetValue().upper()
                if p3.match(self.OP_ID) is None:
                    self.OP_ID = 'Cancel'
                    continue
                else:
                    self.messagetext.AppendText('歡迎' + '[' + str(self.OP_ID) + ']' + '登陸Rotation系統'+'\n')
                    dlg.Destroy()
                    break
            else:
                self.OP_ID = 'Cancel'
                dlg.Destroy()
                #sys.exit()
                break
        return self.OP_ID


    def setmaterialdata(self,label):
        self.materialdatavalue=label
        #self.materialdata.AppendText(label)
        self.materialdata.SetValue(label)
    def getmaterialdata(self):
        return self.materialdatavalue
    def setmessagedata(self,label):
        if '\n\r' in label:
            self.messagetext.AppendText(label)
        else:
            self.messagetext.AppendText(label+'\n')
    def getscaninfo(self,evt):
        pass
        # self.setmaterialtype(typelist[0])
        # if self.materialdatavalue==typelist[0] and len(self.datascan.GetValue())== 13 and self.datascan.GetValue()[0:6]=='PPPCFL':
        #     print self.datascan.GetValue()
        #     datalist.append(self.datascan.GetValue)
        #     print datalist
        # self.setmaterialtype(typelist[1])
        # if self.materialdatavalue==typelist[1] and len(self.datascan.GetValue())==8 and self.datascan.GetValue()[0:3]=='123':
        #     print self.datascan.GetValue()
        #     datalist.append(self.datascan.GetValue)
        #     print datalist
        #
    def setinsertflag(self,flag=True):
        self.insertflag=flag
    def onKeyDown(self,event):
        p1 = re.compile(u'PPCFL[A-Z0-9]{8}')
        p2 = re.compile(u'SY[A-Z0-9]{2}')
        p3 = re.compile(u'CPU[A-Z0-9]{6}')
        p4 = re.compile(u'R[A-Z0-9]{7}')
        self.insertflag=True
        self.currenttime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        kc=event.GetKeyCode()
        if (kc==13 or kc == 370):
            #typelist=['主板SN','CPU SN','內存條SN','QLogic網卡SN']
            self.datascan.SetBackgroundColour('Green')
            datascaninfo = self.datascan.GetValue().upper()
            if ((p1.match(datascaninfo) is None or len(datascaninfo) != 13) and self.getmaterialdata()==typelist[0]) or\
                    ((p2.match(datascaninfo) is None or len(datascaninfo) != 4) and "內存條" in self.getmaterialdata()) or\
                    ((p3.match(datascaninfo) is None or len(datascaninfo) != 9) and "CPU" in self.getmaterialdata()) or\
                    ((p4.match(datascaninfo) is None or len(datascaninfo) != 8) and "QLogic" in self.getmaterialdata()):
                self.datascan.SetBackgroundColour('Red')
                liststr= '[' + str(datascaninfo)+ ']' + '不是正確的格式,請重新輸入'
                self.messagetext.SetDefaultStyle(wx.TextAttr('RED'))
                self.setmessagedata(label=liststr)
                self.messagetext.SetDefaultStyle(wx.TextAttr('BLACK'))
                self.setinsertflag(flag=False)
            if self.insertflag == True:
                if self.datascan.GetValue() not in self.datalist:
                    self.datalist.append(self.datascan.GetValue().upper())
                    liststr='[' + self.OP_ID + ']' + '[' + self.currenttime + ']' + '[' + self.materialdata.GetValue() + ']'+ ':' + '['+ self.datascan.GetValue()+ ']'\
                    + '--->' + '[' + self.datalist[0] + ']'
                    self.setmessagedata(label=liststr)
                    if self.mc.checkrotationrecord() or self.getmaterialdata()==typelist[0]:
                        if len(self.datalist)>=1 and len(self.datalist)<3:
                            self.setmaterialdata(label=typelist[1]+ str(len(self.datalist)))
                        if len(self.datalist)>=3 and len(self.datalist)<19:
                            self.setmaterialdata(label=typelist[2]+str(len(self.datalist)-2))
                        if len(self.datalist)>=19 and len(self.datalist)<23:
                            self.setmaterialdata(label=typelist[3]+str(len(self.datalist)-19))
                        if len(self.datalist)==23:
                            self.datascan.Clear()
                            self.mc.connect()#kobe
                            self.mc.RecordRotate(self.datalist)#kobe
                            self.setmaterialdata(label=typelist[0])
                            self.datalist=[]
                            self.messagetext.SetDefaultStyle(wx.TextAttr('Green'))
                            self.messagetext.AppendText('此板綁定已完成,請換一下片板。'+'\n')
                            self.messagetext.AppendText('-----------------------------------------------------------------'+'\n')
                            self.messagetext.SetDefaultStyle(wx.TextAttr('BLACK'))
                    else:
                        self.datascan.SetBackgroundColour('Red')
                        liststr= '[' + str(datascaninfo)+ ']' + '此SN到達使用限制,請更換新物料'
                        self.messagetext.SetDefaultStyle(wx.TextAttr('RED'))
                        self.setmessagedata(label=liststr)
                        self.messagetext.SetDefaultStyle(wx.TextAttr('BLACK'))
                else:
                    self.datascan.SetBackgroundColour('Red')
                    liststr= '[' + str(datascaninfo)+ ']' + '此SN重复,請重新輸入'
                    self.messagetext.SetDefaultStyle(wx.TextAttr('RED'))
                    self.setmessagedata(label=liststr)
                    self.messagetext.SetDefaultStyle(wx.TextAttr('BLACK'))
            self.datascan.Clear()
        event.Skip()
    def getSN(self):
        print self.datascan.GetValue()
    def RecordSN(self):
        pass
    def samplescankeydown(self,event):
        pass

Uut.py:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
class Uut(object):
    def __init__(self):
        self.sernum = ''
        self.rectime = ''
        self.dimmsnlist = ''
        self.failitem = ''
        self.recordlist = []
        self.parentsn = []
        self.rectimelist = []
        self.rotateday = 0
        self.rotatecount = 0
    def setsernum(self,value):
        self.sernum = value
    def getsernum(self):
        return self.sernum
    def setdimmsnlist(self,value):
        self.dimmsnlist = value
    def getdimmsnlist(self,value):
        return self.dimmsnlist
    def setrectime(self,value):
        self.rectime = value
    def getrectime(self):
        return self.rectime
    def setrecordlist(self,value):
        self.recordlist = value
    def getrecordlist(self):
        return self.recordlist
    def setrectimelist(self,value):
        self.rectimelist = value
    def getrectimelist(self):
        return self.rectimelist
    def setrotateday(self,value):
        self.rotateday = value
    def getrotateday(self):
        return self.rotateday
    def setrotatecount(self,value):
        self.rotatecount = value
    def getrotatecount(self):
        return self.rotatecount


快来点我啊

快来点我啊
回复

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-27 17:55:17 | 显示全部楼层
小弟又更新的点功能,支持批量导出数据,生成文档,保存在指定路径,欢迎大家提出宝贵意见。
附上代码和效果图。(快快点击看图噢)
Downloadwindow.py:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import time
import sys
import wx
import re
import json
import os.path
import MySQLdb
from MysqlConnection import MysqlConnection
from Uut import Uut

class Downloadwindow(object):
    def __init__(self,parent):
        self.parent = parent
        self.win = wx.Frame(None,-1,title='下載數據',size=(360,210))
        self.win.Center(True)
        self.panel=wx.Panel(self.win)
        self.panel.SetBackgroundColour('#DDD')

        self.uut = Uut()#kobe
        self.uut.setsernum('')#kobe

        self.mc = MysqlConnection('localhost','root','purestorage')#kobe

        # self.startyearlist1=range(2016,2019)
        # self.startyearlist=[]
        # self.endyearlist=[]
        # for i in self.startyearlist1:
        #     self.startyearlist.append('%d'%i)
        #     self.endyearlist.append('%d'%i)
        self.startyearlist=['%02d' % i for i in range(2016,2020)]
        self.endyearlist=['%02d' % i for i in range(2016,2020)]

        self.startmonthlist=['%02d' % i for i in range(1,13)]
        self.endmonthlist=['%02d' % i for i in range(1,13)]

        self.startdaylist=['%02d' % i for i in range(1,31)]
        self.enddaylist=['%02d' % i for i in range(1,31)]


        self.gbsizer = wx.GridBagSizer(5,5)
        self.starttime = wx.StaticText(self.panel,-1,'起始日期:')
        self.gbsizer.Add(self.starttime,pos=(1,1),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.startyear = wx.Choice(self.panel,-1,size=(65,25),choices=self.startyearlist)
        self.startyear.SetStringSelection(self.startyearlist[0])
        self.gbsizer.Add(self.startyear,pos=(1,2),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.startmonth = wx.Choice(self.panel,-1,size=(65,25),choices=self.startmonthlist)
        self.startmonth.SetStringSelection(self.startmonthlist[0])
        self.gbsizer.Add(self.startmonth,pos=(1,3),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.startday = wx.Choice(self.panel,-1,size=(65,25),choices=self.startdaylist)
        self.startday.SetStringSelection(self.startdaylist[0])
        self.gbsizer.Add(self.startday,pos=(1,4),span=(1,1),flag=wx.ALIGN_RIGHT)


        # self.starttimetext = wx.TextCtrl(self.panel,size=(105,25))
        # self.gbsizer.Add(self.starttimetext,pos=(1,2),span=(1,1),flag=wx.ALIGN_LEFT)
        self.endtime = wx.StaticText(self.panel,-1,'截止日期:')
        self.gbsizer.Add(self.endtime,pos=(2,1),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.endyear = wx.Choice(self.panel,-1,size=(65,25),choices=self.endyearlist)
        self.endyear.SetStringSelection(self.endyearlist[0])
        self.gbsizer.Add(self.endyear,pos=(2,2),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.endmonth = wx.Choice(self.panel,-1,size=(65,25),choices=self.endmonthlist)
        self.endmonth.SetStringSelection(self.endmonthlist[0])
        self.gbsizer.Add(self.endmonth,pos=(2,3),span=(1,1),flag=wx.ALIGN_RIGHT)

        self.endday = wx.Choice(self.panel,-1,size=(65,25),choices=self.enddaylist)
        self.endday.SetStringSelection(self.enddaylist[0])
        self.gbsizer.Add(self.endday,pos=(2,4),span=(1,1),flag=wx.ALIGN_RIGHT)

        # self.endtimeTxt = wx.TextCtrl(self.panel,size=(105,25))
        # self.gbsizer.Add(self.endtimeTxt,pos=(1,6),span=(1,1),flag=wx.ALIGN_LEFT)

        self.sample_list=['ALL','CPU','DIMM','QLogic']
        self.materialchoice = wx.RadioBox(self.panel,-1,'物料選擇:',choices=self.sample_list,majorDimension=6,style=wx.RA_SPECIFY_COLS)
        self.gbsizer.Add(self.materialchoice,pos=(3,1),span=(1,4),flag=wx.ALIGN_LEFT)
        self.applybutton=wx.Button(self.panel,-1,'提交')
        self.gbsizer.Add(self.applybutton,pos=(4,3),span=(1,1),flag=wx.ALIGN_RIGHT)
        self.applybutton.Bind(wx.EVT_BUTTON, self.onApply)
        self.btnCancel = wx.Button(self.panel,-1,'取消')
        self.gbsizer.Add(self.btnCancel,pos=(4,4),span=(1,1),flag=wx.ALIGN_RIGHT)
        self.btnCancel.Bind(wx.EVT_BUTTON, self.onCancel)

        

        self.panel.SetSizerAndFit(self.gbsizer)


    def onApply(self,event):
        self.starttime= self.startyear.GetStringSelection()+ '/' + self.startmonth.GetStringSelection()+ '/' + self.startday.GetStringSelection()
        self.endtime=self.endyear.GetStringSelection()+ '/' + self.endmonth.GetStringSelection()+ '/' + self.endday.GetStringSelection()
        self.material=self.materialchoice.GetStringSelection()
        print self.starttime
        print self.endtime
        print self.material
        self.uut.setstarttime(self.starttime)
        self.uut.setendtime(self.endtime)
        self.uut.setmaterial(self.material)
        self.mc.connect()
        self.mc.Searchdata(self.uut.getstarttime(),self.uut.getendtime(),self.uut.getmaterial())
        self.showFileDialog()
        event.Skip()
    def onCancel(self,event):
        self.win.Show(False)
    def show(self,bool):
        self.win.Show(bool)

    def showFileDialog(self):
        dir = r'/home/admin/Rotation/log'
        if os.path.exists(dir):
            pass
        else:
            os.mkdir(dir)
        dlg = wx.FileDialog(None,message='Save file',\
            defaultDir=dir,defaultFile='',wildcard='*.txt',style=wx.CHANGE_DIR|wx.SAVE|wx.OVERWRITE_PROMPT)
        if dlg.ShowModal() == wx.ID_OK:
            filename = dlg.GetPath()
            #print self.mc.uut.getrecordlist()
            f = open(filename,'w')
            f.write(self.mc.uut.getrecordlist())
            f.close()
        else:
            pass
        dlg.Destroy()

Update 了一下之前的MysqlConnection.py, 最新的code如下:
感觉生成数据那块有点繁琐,list[0]一直到list[25],欢迎提供更简单的方法
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import time
import sys
import wx
from Uut import Uut
import MySQLdb

CPUrotationtime=30
DIMMrotationtime=30
QLogicrotationtime=30

# class scandata:
#     def __init__(self,sernum='',dimmsn1='',dimmsn2='',dimmsn3='',dimmsn4='',
#     dimmsn5='',dimmsn6='',dimmsn7='',dimmsn8='',dimmsn9='',dimmsn10='',dimmsn11='',
#                  dimmsn12='',dimmsn13='',dimmsn14='',dimmsn15='',dimmsn16='',
#                  rectime=''):
#         self.sernum = sernum
#         self.dimmsn1 = dimmsn1
#         self.dimmsn2 = dimmsn2
#         self.dimmsn3 = dimmsn3
#         self.dimmsn4 = dimmsn4
#         self.dimmsn5 = dimmsn5
#         self.dimmsn6 = dimmsn6
#         self.dimmsn7 = dimmsn7
#         self.dimmsn8 = dimmsn8
#         self.dimmsn9 = dimmsn9
#         self.dimmsn10 = dimmsn10
#         self.dimmsn11 = dimmsn11
#         self.dimmsn12 = dimmsn12
#         self.dimmsn13 = dimmsn13
#         self.dimmsn14 = dimmsn14
#         self.dimmsn15 = dimmsn15
#         self.dimmsn16 = dimmsn16
#         self.rectime = rectime
#
#     def getSernum(self):
#         return self.sernum

# class faildata:
#     def __init__(self,sernum='',dimmsn1='',dimmsn2='',dimmsn3='',dimmsn4='',
#     dimmsn5='',dimmsn6='',dimmsn7='',dimmsn8='',dimmsn9='',dimmsn10='',dimmsn11='',
#                  dimmsn12='',dimmsn13='',dimmsn14='',dimmsn15='',dimmsn16='',
#                  testresult='',failitem=''):
#         self.failitem = failitem
#         self.count = 1
#         self.sernum = [sernum]
#         self.dimmsernum = [dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,
#                            dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,
#                            dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16]

class MysqlConnection:
    def __init__(self,host,usr,pwd,db='test',port=3306):
        self.host=host
        self.usr=usr
        self.pwd=pwd
        self.db=db
        self.port=port
        self.conn = None
        self.isConnected = False
        self.cursor = None
        self.uut = Uut()

    def connect(self):
        self.conn = MySQLdb.connect(host=self.host,port=self.port,user=self.usr,passwd=self.pwd,db=self.db)
        if self.conn != None:
            self.cursor = self.conn.cursor()
            self.creatDb()
            self.isConnected = True
            #print self.isConnected
        else:
            self.isConnected = False

    def setWarning(self,bool):
        if bool:
            self.cursor.execute("SET sql_notes = 0")
        else:
            self.cursor.execute("SET sql_notes = 1")

    def creatDb(self):
        self.setWarning(True)
        self.cursor.execute("CREATE TABLE IF NOT EXISTS rotate (\
            id INT PRIMARY KEY AUTO_INCREMENT,\
            sernum VARCHAR(25),\
            cpu1 VARCHAR (25),\
            cpu2 VARCHAR (25),\
            dimmsn1 VARCHAR(25),\
            dimmsn2 VARCHAR(25),\
            dimmsn3 VARCHAR(25),\
            dimmsn4 VARCHAR(25),\
            dimmsn5 VARCHAR(25),\
            dimmsn6 VARCHAR(25),\
            dimmsn7 VARCHAR(25),\
            dimmsn8 VARCHAR(25),\
            dimmsn9 VARCHAR(25),\
            dimmsn10 VARCHAR(25),\
            dimmsn11 VARCHAR(25),\
            dimmsn12 VARCHAR(25),\
            dimmsn13 VARCHAR(25),\
            dimmsn14 VARCHAR(25),\
            dimmsn15 VARCHAR(25),\
            dimmsn16 VARCHAR(25),\
            QLogic1 VARCHAR (25),\
            QLogic2 VARCHAR (25),\
            QLogic3 VARCHAR (25),\
            QLogic4 VARCHAR (25),\
            rectime DATETIME)")
        self.setWarning(False)
        self.conn.commit()

    def executeCmd(self,cmd):
        if not self.isConnected:
            return False
        self.cursor.execute(cmd)
        self.conn.commit()
        return True

    def RecordRotate(self,sernum):
        if not self.isConnected:
            return False
        #print sernum
        # self.databasetime=str(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time())))

        self.executeCmd("INSERT INTO rotate (sernum,cpu1,cpu2,dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,\
        dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16,QLogic1,QLogic2,QLogic3,QLogic4,rectime) VALUES \
                        ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',NOW())" %(
            sernum[0],
            sernum[1],
            sernum[2],
            sernum[3],
            sernum[4],
            sernum[5],
            sernum[6],
            sernum[7],
            sernum[8],
            sernum[9],
            sernum[10],
            sernum[11],
            sernum[12],
            sernum[13],
            sernum[14],
            sernum[15],
            sernum[16],
            sernum[17],
            sernum[18],
            sernum[19],
            sernum[20],
            sernum[21],
            sernum[22]))
        # self.executeCmd("INSERT INTO rotate sernum,dimmsn1 VALUES '%s','%s'" % (sernum[0],sernum[1]))

    def checkrotationrecord(self):
            return True

    def RotateFind(self,sernum):
        if not self.isConnected:
            return False
        count1 = self.cursor.execute("SELECT sernum,rectime from rotate where '%s' in (cpu1,cpu2,dimmsn1,dimmsn2,dimmsn3,dimmsn4,dimmsn5,\
                                    dimmsn6,dimmsn7,dimmsn8,dimmsn9,dimmsn10,dimmsn11,dimmsn12,dimmsn13,dimmsn14,dimmsn15,dimmsn16,QLogic1,QLogic2,QLogic3,QLogic4);"%(sernum[0]))
        if count1 > 0:
            results = self.cursor.fetchmany(count1)
            for r in results:
                self.uut.recordlist.append('%s\t %s\t %s\t'%(sernum[0],str(r[0]),str(r[1])))
                self.uut.rectimelist.append(str(r[1]))
                # self.uut.binddimmlist.append(sernum[0])
                # self.uut.parentsn.append(str(r[0]))
                # self.uut.rectimelist.append(str(r[1]))
            self.uut.setrotatecount(count1)
            count2 = self.cursor.execute("SELECT TIMESTAMPDIFF (DAY,'%s','%s');"%(self.uut.rectimelist[0],self.uut.rectimelist[count1-1]))
            self.uut.setrotateday(count2)
        self.uut.setrecordlist(self.uut.recordlist)

    def Searchdata(self,startt,endt,materialt):
        self.uut.recordlist=[] # must be reset to list from string before re-save different type material file
        if not self.isConnected:
            return False
        print startt
        count1 = self.cursor.execute("SELECT * from rotate where rectime between '%s' and '%s';"%(startt,endt))
        if count1 > 0:
            results = self.cursor.fetchmany(count1)
            for r in results:
                if materialt =='ALL':
                    self.uut.recordlist.append('%s\t %s\t %s\t %s\t %s\t %s\t %s\t \
                    %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \
                    %s\t %s\t %s\t %s\t %s\t %s\t %s\t'%(str(r[0]),str(r[1]),str(r[2]),str(r[3]),str(r[4]),str(r[5]),str(r[6]),\
                                                         str(r[7]),str(r[8]),str(r[9]),str(r[10]),str(r[11]),str(r[12]),\
                                                         str(r[13]),str(r[14]),str(r[15]),str(r[16]),str(r[17]),str(r[18]),\
                                                         str(r[19]),str(r[20]),str(r[21]),str(r[22]),str(r[23]),str(r[24])))
                elif materialt =='CPU':
                    self.uut.recordlist.append('%s\t %s\t %s\t %s\t %s\t'%(str(r[0]),str(r[1]),str(r[2]),str(r[3]),str(r[24])))
                elif materialt =='DIMM':
                    self.uut.recordlist.append('%s\t %s\t %s\t %s\t %s\t %s\t \
                    %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \
                    %s\t %s\t %s\t %s\t'%(str(r[0]),str(r[1]),str(r[4]),str(r[5]),\
                                                 str(r[6]),str(r[7]),str(r[8]),str(r[9]),str(r[10]),str(r[11]),\
                                                 str(r[12]),str(r[13]),str(r[14]),str(r[15]),str(r[16]),str(r[17]),\
                                                 str(r[18]),str(r[19]),str(r[24])))
                elif materialt =='QLogic':
                    self.uut.recordlist.append('%s\t %s\t %s\t %s\t %s\t %s\t %s\t'\
                                               %(str(r[0]),str(r[1]),str(r[20]),str(r[21]),str(r[22]),str(r[23]),str(r[24])))

                #self.uut.rectimelist.append(str(r[1]))
                # self.uut.binddimmlist.append(sernum[0])
                # self.uut.parentsn.append(str(r[0]))
                # self.uut.rectimelist.append(str(r[1]))
        self.uut.recordlist='\n'.join(self.uut.recordlist)
        self.uut.setrecordlist(self.uut.recordlist)
        #print self.uut.getrecordlist()

    def close(self):
        if self.conn != None:
            self.cursor.close()
            self.conn.close()
            self.cursor = None
            self.conn = None
            self.isConnected = False



编辑1.JPG
下载数据.JPG
效果图.JPG
回复 支持 1 反对 0

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-27 17:56:26 | 显示全部楼层
效果图放错了,应该是这个。
save.JPG
回复 支持 1 反对 0

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-26 17:36:21 | 显示全部楼层
自己顶一下自己,嘿嘿!!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-26 17:43:56 | 显示全部楼层
嗨,奇怪了,没有?自己顶!!!
回复 支持 反对

使用道具 举报

48

主题

1028

帖子

1079

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1079

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-7-26 19:15:13 | 显示全部楼层
{:8_204:} 不错
回复

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-27 09:04:32 | 显示全部楼层
只有管理员支持了一下。
回复 支持 反对

使用道具 举报

5

主题

158

帖子

159

积分

版主

Rank: 7Rank: 7Rank: 7

积分
159

热心会员突出贡献优秀版主荣誉管理

mongo 发表于 2016-7-27 14:56:13 | 显示全部楼层
我的天  如此的棒{:8_204:}
回复 支持 反对

使用道具 举报

5

主题

158

帖子

159

积分

版主

Rank: 7Rank: 7Rank: 7

积分
159

热心会员突出贡献优秀版主荣誉管理

mongo 发表于 2016-7-27 14:59:16 | 显示全部楼层
你是大牛{:8_204:}
回复

使用道具 举报

1

主题

11

帖子

13

积分

贫民

积分
13
panda哈哈  楼主| 发表于 2016-7-27 17:45:18 | 显示全部楼层

管理员,我又增加了一些功能,想更新这个帖子,怎么弄??直接在后面留言吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表