中國少數民族語言文字網站收集軟件預告--python

        本身用python寫的軟件,第一次寫軟件,代碼不夠成熟,由於代碼還不夠完善,仍舊調試中,目前提供gui界面代碼,待基本功能實現後提供源碼。本軟件的目標是實現收集中國各個具備本身文字的民族的少語網站。目前可以收集蒙、藏、維、哈、柯、傣、彝、朝8種語言,壯文還沒有進行。維哈柯語言的區分識別有難度,但已實現區分識別。蒙文網站是目前遇到最難識別的(編碼多樣,有的網站以圖片或flash組成等),不過已經解決大部分難題。藏文的編碼也多樣,相對蒙文來講比較簡單。程序代碼仍有點問題,故暫不提供源碼。
python

        先上圖:
數據庫

        啓動界面服務器

        


        主界面app

        

        掃描預處理信息
框架

        

        掃描識別ide

        

        運行結果收集
函數

        

        欲收集語言選擇
工具

        

        預處理搜索引擎選擇
oop

        

        系統設置
佈局

        

        查看入庫網站

        

        編輯入庫信息

        

        收集結果導出Excel表格

        

        關於本軟件

        

# -*- coding:utf-8 -*-
'''
Created on Oct 2, 2013

@author: Hyphen

'''

import os,time,gc,wx

import globalvar.guiGlobalVar as ggv
import globalvar.crawlerGlobalVar as cgv
from initialVar import InitialVar
from about import About
from syssetting import SysSetting
from startrun import StartRun
from utils.logger import Logger
from checkDB import CheckDB

MENU_LANG = wx.NewId()
MENU_ENG = wx.NewId()
MENU_SYS_SET = wx.NewId()
TOOLBAR_SYS_SET = wx.NewId()
WELCOMESTR = u'\r\n\t\t歡迎使用少數民族網站收集軟件!\r\n\r\n\r\n'

class MainWindow(wx.Frame):
    def __init__(self, parent=None, title=u'少數民族文字網站收集軟件'):
        '''
        :初始化界面:大小、啓動畫面背景顏色等
        :設置界面的佈局等屬性
        :param parent: none
        :param title: 界面標題
        '''
        wx.Frame.__init__(self, parent, 
                          title=title, 
                          size=(600, 450),
                          style=wx.DEFAULT_FRAME_STYLE ^(wx.RESIZE_BORDER |wx.MAXIMIZE_BOX))
        # 在主程序運行前顯示歡迎圖片
        bmp = wx.Image('../images/welcome.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        wx.SplashScreen(bmp, 
                        wx.SPLASH_CENTER_ON_PARENT | wx.SPLASH_TIMEOUT,
                        2500, 
                        None, 
                        -1)
        wx.Yield()
        time.sleep(2)
        # 系統變量:語言、搜索引擎、保存文檔類型
        ggv.window  = self                                  #生成主框架
        self.CenterOnScreen()                               # 窗口顯示在屏幕的正中間位置
        # 爲主窗口標題添加圖片
        self.icon = wx.Icon('../images/icon2.ico',wx.BITMAP_TYPE_ICO)
        self.SetIcon(self.icon)
        self.SetBackgroundColour('white')
        # 構建頁面的主函數
        self._SetStatusBar()                                # 設置窗口大小和位置
        self._CreateMenubar()
        self._CreateToolBar()
        self._CreateSizer()                                 #建立容器及佈局
        #顯示系統默認值
        self.sysinfoUpdate()
        
        self.Show()                                         #窗口顯示
        
    '''*********主要函數**********'''
    # 設置窗口的大小和位置
    def _SetStatusBar(self):
        '''
        :狀態欄的設置,屬性、大小、比例等。共分爲3個狀態欄,負責不一樣的狀態提示
        :在第二狀態欄設置添加進度條
        '''
        self.CreateStatusBar(3)                             # 添加3個狀態欄。第一個爲軟件提示狀態,第二個爲程序運行狀態,第三個爲程序輸出結果狀態
        self.SetStatusText(u'歡迎使用少數民族語言文字網站收集軟件')
        self.SetStatusWidths([-5,-5,-3])                                        #設置狀態欄的比例
        self.gauge = wx.Gauge(self.StatusBar,-1,100,pos=(375,4),size=(80,16))   #第二個狀態欄設置進度條,在識別網頁語言是使用
        self.gauge.SetBezelFace(3)                          #進度條的顯示風格
        self.gauge.SetShadowWidth(3)                        #進度條的寬度
        self.gauge.Hide()                                   #默認隱藏
        
    def _CreateMenubar(self):
        '''
        :建立菜單欄並添加子菜單和菜單項
        '''
        menubar = wx.MenuBar()                              #建立菜單欄
        for eachMenuData in self.menuData():                #添加子菜單及菜單項
            menuLabel = eachMenuData[0]
            menuItems = eachMenuData[1:]
            menubar.Append(self.createMenu(menuItems),menuLabel)
        self.SetMenuBar(menubar)                            #將菜單加入主界面顯示
        
    def _CreateToolBar(self):
        '''
        :建立工具欄並添加工具圖標
        '''
        toolbar = self.CreateToolBar()                      #建立工具欄
        for each in self.toolbarData():                     #添加工具
            self.createTool(toolbar,*each)
        toolbar.Realize()                                   #顯示工具欄
        
    def _CreateSizer(self):
        '''
        :建立面板主容器,存放界面左側屬性面板和右側顯示面板
        '''
        leftSizer = wx.BoxSizer(wx.VERTICAL)                #使用Boxsizer做爲容器存放左側屬性設置信息
        notebook = wx.Notebook(self,-1)                     #使用Notebook做爲實時信息顯示容器
        self.createLeftPanel(leftSizer)
        self.createNotebook(notebook)
        sizer = wx.BoxSizer(wx.HORIZONTAL)                  #左右側容器水平放置到父容器中
        sizer.Add(leftSizer,2,wx.EXPAND,1)
        sizer.Add(notebook,5,wx.ALL | wx.EXPAND,1)
        self.SetSizer(sizer)                                #把父容器添加到主界面
    
    '''**********子函數 **********'''
    '''**********菜單子函數 **********'''
    def menuData(self):
        '''
        :菜單的各項信息以及相應的觸發事件
        :self.On*的函數爲點擊菜單項出發的事件
        '''
        return ((u"文件",
                    (u'查看數據庫', u'查詢數據庫', self.OnDBCheck),   #第二項爲在第一狀態欄顯示的信息
                    ('','',''),                             #沒有數據則後面的程序爲之添加分隔符
                    (u'導入庫', u'從外面文件導入數據庫', self.OnImport),
                    (u'導出庫', u'從數據庫中導出數據', self.OnExport),
                    ('','',''),
                    (u'退出', u'退出程序', self.OnExit)),
                (u"編輯",
                    (u'語言選擇',u'選擇須要蒐集的語言'),                 #長度爲2表明該項還具備子菜單或子菜單項
                    ('','',''),
                    (u'搜索引擎選擇',u'選擇搜索引擎'),
                    ('','',''),
                    (u'系統設置', u'設置系統的代理服務器,延時,線程數,閾值等', self.OnSysSet),
                    ('','',''),
                    (u'修改數據庫', u'修改數據庫數據', self.OnDataEdit),
                    ('','',''),
                    (u'首選項',u'添加或設置系統功能',self.OnPreferenceSet)),
                (u"統計",
                    (u'最新入庫', u'查看最新入庫數據', self.OnNewIn),
                    (u'最新詞語', u'查看最新詞語', self.OnNewWord),
                    ('','',''),
                    (u'入庫直方圖 ', u'查看入庫數據的直方圖', self.OnTaproot),
                    ('','',''),
                    (u'詞頻走勢', u'查看詞語詞頻走勢', self.OnTrend)),
                (u"關於",
                    (u'本軟件', u'關於本軟件的做者和版本', self.OnAbout),
                    ('','',''),
                    (u'更新軟件', u'更新軟件到最新版本', self.OnUpdate),
                    ('','',''),
                    (u'幫助', u'本軟件幫助程序', self.OnHelp)))

    def createSubMenu(self,flag):
        '''
        :建立子菜單項
        :param flag:區分搜索引擎和語言選擇子菜單項的建立
        '''
        handler = self.OnLangEngineSelect                   #搜索引擎選擇和語言選擇事件處理函數
        if flag == 1:
            lists = ggv.langs
        else:
            lists = ggv.engines
        subLabel = wx.Menu()
        for lbl in lists:                                   #添加菜單項
            menuItem = subLabel.Append(-1,'%s'%lbl,u'選擇%s'%lbl,wx.ITEM_RADIO)
            self.Bind(wx.EVT_MENU, handler, menuItem)
        return subLabel
    
    def createMenu(self,menuData):
        '''
        :建立菜單
        :param menuData:須要建立的菜單信息
        '''
        menu = wx.Menu()
        for eachItem in menuData:
            if len(eachItem) == 2:                          #長度爲2須要另行處理,由於其還有子項
                eachLabel,eachStatus = eachItem
                if eachLabel == u'語言選擇':                #區分語言選擇菜單仍是搜索引擎選擇菜單
                    submenu = self.createSubMenu(1)
                    menu.AppendMenu(MENU_LANG,eachLabel,submenu)
                else:
                    submenu = self.createSubMenu(2)
                    menu.AppendMenu(MENU_ENG,eachLabel,submenu)
            else:                                           #單獨做爲菜單項處理
                eachLabel, eachStatus, eachHandler = eachItem
                if not eachLabel:                           #空項處添加分割符
                    menu.AppendSeparator()
                    continue
                if eachLabel == u'系統設置':
                    menuItem = menu.Append(MENU_SYS_SET,eachLabel,eachStatus)
                else:
                    menuItem = menu.Append(-1, eachLabel, eachStatus)
                self.Bind(wx.EVT_MENU, eachHandler, menuItem)
        return menu

    '''**********工具欄子函數**********'''

    def toolbarData(self):
        '''
        :工具欄數據項
        '''
        return ((u'導入庫','../images/import.png',u'從外面文件導入數據庫',self.OnImport),
                (u'導出庫','../images/export.png',u'從數據庫導出數據',self.OnExport),
                ('','','',''),                              #數據爲空則添加分隔符
                (u'最新入庫','../images/newIn.png',u'最新入庫的網站網址',self.OnNewIn),
                (u'最新單詞','../images/newWord.png',u'最新發現詞語',self.OnNewWord),
                ('','','',''),
                (u'直方圖','../images/taproot.png',u'蒐集結果中網站數量直方圖',self.OnTaproot),
                (u'詞頻走勢','../images/trend.png',u'最近蒐集到的最常出現詞語走勢',self.OnTrend),
                ('','','',''),
                (u'修改數據庫','../images/edit.png',u'修改數據庫數據',self.OnDataEdit),
                (u'系統設置','../images/setting.png',u'設置系統的代理服務器,延時,線程數,閾值等',self.OnSysSet),
                ('','','',''),
                (u'幫助','../images/help.png',u'須要幫助請點擊',self.OnHelp),
                ('','','',''),
                (u'退出','../images/exit.png',u'退出程序',self.OnExit))
    
    def createTool(self,toolbar,label,imagename,status,handler):
        '''
        :建立工具項
        :param toolbar:父容器,即建立到工具欄
        :param label:工具標籤
        :param imagename:圖標的名字
        :param status:鼠標移動到圖標時第一狀態欄顯示的信息
        :param handler:事件處理函數
        '''
        if not label:                                       #label爲空,添加分隔符
            toolbar.AddSeparator()
            return
        bmp = wx.Image(imagename,wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        if label == u'系統設置':                            #程序運行時系統不可設置,故此處須要單獨處理。鎖定ID
            tool = toolbar.AddSimpleTool(TOOLBAR_SYS_SET,bmp,label,status)
        else:
            tool = toolbar.AddSimpleTool(-1,bmp,label,status)
        self.Bind(wx.EVT_MENU, handler, tool)
    '''********** 主體子函數 **********'''
    '''**********左邊欄**********'''
    def createLeftPanel(self,ls):
        '''
        :建立左側屬性信息設置面板的各項信息和屬性
        :param ls:父容器,即主界面左側容器
        '''
        #系統設置BoxSizer
        sysSizers = wx.StaticBox(self,-1,'')                #系統設置靜態box分組,使之能顯示組名
        sp = wx.Panel(self,-1)                              #每組分配一個面板存放其它小器件
        wx.StaticText(sp,-1,
                      u'系統設置:',
                      pos=(10,5),
                      size=(60,25))
        self.sysButton = wx.Button(sp,-1,
                                   u'設  置',
                                   pos=(75,5),
                                   size=(70,25))
        wx.StaticText(sp,-1,
                      u'語言選擇:',
                      pos=(10,35),
                      size=(60,25))
        self.langChoice = wx.Choice(sp,-1,
                                    choices = ggv.langs,
                                    pos=(75,35),
                                    size=(70,20))
        wx.StaticText(sp,-1,
                      u'搜索引擎:',
                      pos=(10,65),
                      size=(60,25))
        self.engChoice = wx.Choice(sp,-1,
                                   choices = ggv.engines,
                                   pos=(75,65),
                                   size=(70,20))
        sysSizer = wx.StaticBoxSizer(sysSizers,wx.VERTICAL) #添加靜態box到容器boxsiser裏
        sysSizer.Add(sp,1,wx.EXPAND,0)                      #設置容器的屬性,可伸縮、邊界爲0
        #設置初始值
        self.langChoice.SetSelection(0)                     #設置默認選擇值爲語言列表的第一個語言
        self.engChoice.SetSelection(0)                      #設置默認選擇搜索引擎列表第一個搜索引擎
        #綁定事件
        self.Bind(wx.EVT_BUTTON,self.OnSysSet,self.sysButton)                   #爲系統設置按鈕事件添加響應函數
        self.Bind(wx.EVT_CHOICE,self.OnLangSelect,self.langChoice)              #爲語言選擇下拉菜單事件添加響應函數
        self.Bind(wx.EVT_CHOICE,self.OnEngineSelect,self.engChoice)             #爲搜索引擎選擇下拉菜單事件添加響應函數

        #關鍵字BoxSizer
        kwSizers = wx.StaticBox(self,-1,'')                 #關鍵字設置靜態分組
        kwp = wx.Panel(self,-1)
        self.radio1 = wx.RadioButton(kwp,-1,
                                     u'系統默認',
                                     pos=(10,5),
                                     size=(70,25),
                                     style = wx.RB_GROUP)
        self.radio2 = wx.RadioButton(kwp,-1,
                                     u'手工輸入',
                                     pos=(80,5),
                                     size=(70,25))
        wx.StaticText(kwp,-1,
                      u'關鍵字:',
                      pos=(10,35),
                      size=(50,25))
        self.keywordh = wx.TextCtrl(kwp,-1,
                                    pos=(65,35),
                                    size=(80,20))
        wx.StaticText(kwp,-1,
                      u'編   碼:',
                      pos=(10,65),
                      size=(50,25))
        self.codeChoice = wx.Choice(kwp,-1,
                                    choices = ggv.codes,
                                    pos=(65,65),
                                    size=(80,20))
        kwSizer = wx.StaticBoxSizer(kwSizers,wx.VERTICAL)
        kwSizer.Add(kwp,1,wx.EXPAND,0)                      #設置可伸縮等屬性
        #設置初始值
        self.radio1.SetValue(1)                             #默認選擇第一個按鈕
        self.keywordh.Enable(False)                         #默認非手工輸入
        self.codeChoice.SetSelection(0)                     #默認選擇「unicode」編碼方式
        self.codeChoice.Enable(False)
        for er in [self.radio1,self.radio2]:                #依次添加事件
            self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, er)
        
        #程序控制BoxSizer
        ctrlSizers = wx.StaticBox(self,-1,'')               #程序控制靜態組
        cp = wx.Panel(self,-1)
        wx.StaticText(cp,-1,
                      u'程序運行:',
                      pos=(10,5),
                      size=(60,20))
        self.startB = wx.Button(cp,-1,
                                u'開  始',
                                pos=(75,2),
                                size=(70,22))
        wx.StaticText(cp,-1,
                      u'數 據  庫:',
                      pos=(10,35),
                      size=(60,20))
        self.dbCheck = wx.Button(cp,-1,
                                 u'查  看',
                                 pos=(75,32),
                                 size=(70,22))
        ctrlSizer = wx.StaticBoxSizer(ctrlSizers,wx.VERTICAL)
        ctrlSizer.Add(cp)
        self.Bind(wx.EVT_BUTTON, self.OnStart, self.startB) #程序「開始」「運行」事件
        self.Bind(wx.EVT_BUTTON, self.OnDBCheck, self.dbCheck)                  #程序數據庫查看按鈕事件
        
        #Logo BoxSizer
        logoSizers = wx.StaticBox(self,-1,'')               #python logo靜態組,只添加一張logo圖片
        lp = wx.Panel(self,-1)
        logo = wx.Image('../images/logo.png')
        logo.Rescale(150,50)
        img = wx.BitmapFromImage(logo)
        logo = wx.StaticBitmap(lp,-1,
                               img,
                               wx.DefaultPosition,
                               style=wx.BITMAP_TYPE_PNG)
        logoSizer = wx.StaticBoxSizer(logoSizers,wx.VERTICAL)
        logoSizer.Add(lp,1,wx.EXPAND,0)
        
        #添加到左邊欄BoxSizer
        ls.Add(sysSizer,3,wx.EXPAND,0)                      #添加系統設置組到左側面板
        ls.Add(kwSizer,3,wx.EXPAND,0)                       #添加關鍵字設置組到左側面板
        ls.Add(ctrlSizer,2,wx.EXPAND,0)                     #添加程序控制組到左側面板
        ls.Add(logoSizer,2,wx.EXPAND,0)                     #添加python logo組到左側面板
    '''**********右邊**********'''
    def createSysinfoPanel(self):
        '''
        :建立系統設置信息顯示面板及其屬性
        '''
        self.sysinfo = wx.TextCtrl(self.siPanel,-1,'',
                                   pos=(5,5),
                                   size=(405,300),
                                   style=wx.TE_RICH|wx.TE_MULTILINE)
        self.sysinfo.SetEditable(False)
        self.sysinfo.SetLabel(WELCOMESTR)
        self.sysinfo.SetBackgroundColour('#DEFFAC')
        
    def createScanPanel(self):
        '''
        :建立程序運行掃描信息顯示面板及其屬性
        '''
        self.scanlog = wx.TextCtrl(self.scPanel,-1,'',
                                   pos=(5,5),
                                   size=(405,300),
                                   style=wx.TE_RICH|wx.TE_MULTILINE|wx.TE_DONTWRAP)
        self.scanlog.SetEditable(False)
        self.scanlog.SetLabel(u'掃描信息:\r\n\r\n')
        self.scanlog.SetBackgroundColour('#CCFF80')
        
    def createResultPanel(self):
        '''
        :建立程序運行結果信息顯示面板及其屬性
        '''
        self.rstlog = wx.TextCtrl(self.rstPanel,-1,'',
                                  pos=(5,5),
                                  size=(405,300),
                                  style=wx.TE_RICH|wx.TE_MULTILINE|wx.TE_DONTWRAP)
        self.rstlog.SetEditable(False)
        self.rstlog.SetLabel(u'搜索結果:\r\n\r\n')
        self.rstlog.SetBackgroundColour('#B7FF4A')
        
    def createNotebook(self,nb):
        '''
        :建立notebook容器子項
        :param nb:notebook容器
        '''
        self.siPanel = wx.Panel(nb,-1)                      #系統信息顯示面板
        self.scPanel = wx.Panel(nb,-1)                      #掃描信息顯示面板
        self.rstPanel = wx.Panel(nb,-1)                     #結果信息顯示面板
#         self.nwPanel = wx.Panel(nb,-1)                      #發現新單詞顯示面板
        #建立相應面板
        self.createSysinfoPanel()
        self.createScanPanel()
        self.createResultPanel()
        #添加相應面板到父容器notebook中
        nb.AddPage(self.siPanel,u'系統信息')
        nb.AddPage(self.scPanel,u'掃描信息')
        nb.AddPage(self.rstPanel,u'掃描結果')
#         nb.AddPage(self.nwPanel,u'最新詞彙')
    
    def sysinfoUpdate(self):
        '''
        :更新系統設置信息的顯示
        '''
        infolist = []
        infolist.extend(ggv.personSetList)
        infolist.extend(ggv.systemSetList)
        if not ggv.handInput:
            infolist[2] = u'系統值'
            infolist[3] = u'系統值'
        self.sysinfo.SetValue(WELCOMESTR)                   #重置歡迎語句
        for i,inf in enumerate(infolist):
            if i == 7:inf = 0.01 * inf                      #閾值乘以0.01
            if inf == '':inf = u'無'
            self.sysinfo.AppendText('\t%s\t\t\t%s\r\n'%(ggv.systemsetname[i],inf))
    
    def scanlogUpdate(self,logstring):
        '''
        :掃描信息同步更新
        :param logstring:須要更新的信息
        '''
        ggv.scanindex += 1
        self.scanlog.AppendText(u'序號%04d: \r\n%s\r\n'%(ggv.scanindex,logstring))
        
    def rstlogUpadate(self,rstlogstring):
        '''
        :更細掃描結果的信息
        :param rstlogstring:掃描結果信息
        '''
        ggv.rstindex += 1
        self.rstlog.AppendText(u'序號%04d: \r\n%s\r\n'%(ggv.rstindex,rstlogstring))
    
######################事件響應程序##################
    '''**********事件響應函數**********'''
    def OnImport(self, event):
        '''
        :導入文件事件響應
        :param event:事件值
        '''
        self.dirname = ''
        dlg = wx.FileDialog(self, 
                            u'選擇須要導入的Excel文件', 
                            self.dirname, 
                            "", 
                            wildcard = ggv.wildcard, 
                            style = wx.OPEN | wx.CHANGE_DIR)
        if dlg.ShowModal() == wx.ID_OK:                     #判斷是否確認導入
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(os.path.join(self.dirname, self.filename), 'r')
            self.control.SetValue(f.read())
            f.close()
        dlg.Destroy()
    
    def OnExport(self, event):
        '''
        :文件導出事件響應
        :param event:事件值
        '''
        dlg = wx.FileDialog(self,'Save data as...',
                            os.getcwd(),
                            style = wx.SAVE|wx.OVERWRITE_PROMPT,
                            wildcard = ggv.wildcard)
        if dlg.ShowModal() == wx.ID_OK:                     #確認導出
            filename = dlg.GetPath()
            if not os.path.splitext(filename)[1]:           #確保文件名有後綴
                filename = filename + '.xls'
            self.filename = filename
        dlg.Destroy()
        
    def OnExit(self, event):
        '''
        :程序退出事件響應
        :功能:釋放內存
        :param event:事件值
        '''
        self.StopThreads()
        gc.collect()                                        #釋放內存
        self.Destroy()
    
    def OnLangEngineSelect(self,event):
        '''
        :語言選擇和搜索引擎選擇事件響應
        :param event:
        '''
        menubar = self.GetMenuBar()                         #獲取到菜單欄
        item = menubar.FindItemById(event.GetId())          #經過ID獲得菜單項的值
        if item:
            itemlabel = item.GetLabel()                     #獲取菜單項的標籤值
            if itemlabel in ggv.langs:
                ggv.personSetList[0] = itemlabel
                self.langChoice.SetSelection(ggv.langs.index(itemlabel))        #同步更新主界面左側欄的語言選擇值
                if itemlabel == u'全部語言':                #若是選擇所有語言則禁止手工輸入關鍵字
                    self.OnEnableFalse2()
                else:
                    self.OnEnableTrue2()
            else:
                ggv.personSetList[1] = itemlabel
                self.engChoice.SetSelection(ggv.engines.index(itemlabel))       #同步更新主界面左側欄的引擎選擇值
        self.sysinfoUpdate()                                #同時更新系統設置信息面板顯示值

    def OnLangSelect(self,event):
        '''
        :語言選擇下拉框事件響應
        :param event:事件值
        '''
        lang = event.GetEventObject().GetLabel()
        ggv.personSetList[0] = lang
        if lang == u'全部語言':
            self.OnEnableFalse2()
        else:
            self.OnEnableTrue2()
        self.sysinfoUpdate()                                #同時更新系統設置信息面板顯示值
        
    def OnEngineSelect(self,event):
        '''
        :搜索引擎選擇下拉框事件響應
        :param event:事件值
        '''
        ggv.personSetList[1] = event.GetEventObject().GetLabel()
        self.sysinfoUpdate()                                #同時更新系統設置信息面板顯示值
    
    def OnRadio(self,event):
        '''
        :單選組radio按鈕事件響應,即關鍵字的手工輸入或選擇系統值
        :param event:
        '''
        text = event.GetEventObject().GetLabel()
        if text == u'手工輸入':
            ggv.handInput = True                            #設置手工輸入
            self.keywordh.Enable(True)
            self.codeChoice.Enable(True)
        else:
            ggv.handInput = False                           #設置非手工輸入
            self.keywordh.Enable(False)
            self.codeChoice.Enable(False)
        
    def OnEnableTrue2(self):
        '''
        :程序中止後全部的可選選項重啓恢復程序運行以前的狀態
        '''
        self.radio1.Enable(True)
        self.radio2.Enable(True)
        if self.radio2.GetValue():                          #判斷關鍵字的輸入方式
            self.keywordh.Enable(True)
            self.codeChoice.Enable(True)
        
    def OnEnableTrue(self):
        '''
        :程序中止後全部的可選選項重啓恢復程序運行以前的狀態
        '''
        menubar = self.GetMenuBar()
        menubar.Enable(MENU_LANG,True)                      #容許菜單欄語言的選擇
        menubar.Enable(MENU_ENG,True)                       #容許菜單欄搜索引擎的選擇
        menubar.Enable(MENU_SYS_SET,True)                   #容許菜單欄系統設置
        toolbar = self.GetToolBar()                     
        toolbar.EnableTool(TOOLBAR_SYS_SET,True)            #容許工具欄系統設置圖標
        self.startB.SetLabel(u'開  始')                       #開始按鈕標籤值改變
        self.langChoice.Enable(True)                        #容許語言選擇下拉菜單的使用
        self.sysButton.Enable(True)                         #容許系統設置按鈕的使用
        self.engChoice.Enable((True))                       #容許搜索引擎選擇下拉菜單的使用
        self.OnEnableTrue2()                                #其它容許選項
    
    def OnEnableFalse2(self):
        '''
        :程序處於運行狀態不少的功能須要禁止
        :如,關鍵字的設置
        '''
        self.radio1.Enable(False)
        self.radio2.Enable(False)
        if self.radio2.GetValue():
            self.keywordh.Enable(False)
            self.codeChoice.Enable(False)
    
    def OnEnableFalse(self):
        '''
        :程序處於運行狀態不少的功能須要禁止
        :如,菜單欄的語言選擇、搜索引擎選擇和系統設置菜單不可用
        :以及,工具欄的系統設置圖標不可點擊、語言選擇和搜索引擎選擇下拉框不可用
        '''
        menubar = self.GetMenuBar()
        menubar.Enable(MENU_LANG,False)
        menubar.Enable(MENU_ENG,False)
        menubar.Enable(MENU_SYS_SET,False)
        toolbar = self.GetToolBar()
        toolbar.EnableTool(TOOLBAR_SYS_SET,False)
        self.startB.SetLabel(u'結  束')
        self.langChoice.Enable(False)
        self.sysButton.Enable(False)
        self.engChoice.Enable((False))
        self.OnEnableFalse2()                               #關鍵字不可選擇或輸入
        
    def InitStart(self):
        '''
        :初始化界面顯示信息,各類與顯示相關的信息重置或清空
        '''
        Logger()  
        click = 0
        ggv.pterminate = False
        ggv.scanindex = 0                                   #掃描信息索引重置
        ggv.rstindex = 0                                    #收集結果信息索引重置
        self.SetStatusText('',1)                            #第二狀態欄信息清空
        self.SetStatusText('',2)                            #第三狀態欄信息清空
        self.gauge.SetValue(0)                              #進度條清零
        self.scanlog.SetValue(u'掃描信息:\r\n\r\n')             #掃描信息重置
        self.rstlog.SetValue(u'搜索結果:\r\n\r\n')              #搜索結果信息重置
        tempfiles = [ggv.URLTEMPF,ggv.ENGTEMPF,ggv.OUTTEMPF]
        tempfile = [i for i in tempfiles if os.path.exists(i)]
        if len(tempfile) > 0:
            md = wx.MessageDialog(self,
                                  u'檢測到上次程序未徹底運行完成,\r是否繼續運行上次程序?',
                                  u'繼上次運行提示',
                                  wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
            md.CenterOnParent()
            click = md.ShowModal()
        if click == wx.ID_NO:                               #不繼續以前的程序,從新開始
            for j in range(len(tempfiles)):
                if os.path.isfile(tempfiles[j]):
                    os.remove(tempfiles[j])
        if click == wx.ID_CANCEL:                           #不開始程序
            return False
        return True
       
    def OnStart(self,event):
        '''
        :程序開始運行或手動結束函數
        :主要功能:初始化與語言設置等相關的變量
        :param event:
        '''
        if self.startB.GetLabel() == u'開  始':               #程序開始
            if ggv.handInput:                               #若是是手工輸入則提取手工輸入信息
                if not self.keywordh.GetValue():
                    wx.MessageBox(u'請添輸入關鍵字',
                                  '手工輸入',
                                  wx.OK|wx.ICON_ERROR)
                    return
                else:
                    ggv.personSetList[2] = self.keywordh.GetValue()
                    ggv.personSetList[3] = self.codeChoice.GetLabel()
            self.sysinfoUpdate()
            InitialVar()                                    #初始化,並檢測上次運行的結果
            if not self.InitStart():                        #選擇Cancel按鈕,程序不運行
                return
            self.OnEnableFalse()                            #禁止程序屬性設置
            sr = StartRun(self)                             #開始運行程序
            cgv.threadlist.append(sr)                       #使用線程引導主程序運行,若不使用線程將致使界面沒法響應其它的事件,如拖動窗口等
            sr.start()                                      #程序運行
        else:                                               #程序中止
            md = wx.MessageDialog(self,
                                  u'肯定要中止程序嗎?',
                                  u'終止提示',
                                  wx.YES_NO|wx.ICON_QUESTION)
            md.CenterOnParent()
            if md.ShowModal() == wx.ID_YES:                 #肯定終止程序運行
                ggv.pterminate = True                       #發送終止信號
                self.OnEnableTrue()                         #容許程序屬性設置
                self.StopThreads()                          #中止全部的線程
                self.SetStatusText(u'程序被中止',1)          #狀態欄顯示程序被中止信息
                self.SetStatusText('',2)                    #第三狀態欄信息清空
                self.gauge.Hide()
                    
    def OnStop(self): 
        '''
        :程序運行完畢
        :功能:清理數據,在狀態欄顯示相關信息,彈出任務完成對話框
        '''
        '''供其它程序調用,如,主程序已經運行完畢,即調用'''
        ggv.pterminate = False
        self.StopThreads()
        ms = ggv.personSetList[0]+u'網站收集任務完成'
        wx.MessageBox(ms,
                      u'任務完成',
                      wx.OK|wx.ICON_INFORMATION)
        self.SetStatusText(u'程序運行完成',1)
        self.gauge.Hide()
        self.OnEnableTrue()
        
    def StopThreads(self):
        '''
        :清空線程隊列並對每一個線程發送終止信號
        '''
        while cgv.threadlist:
            thread = cgv.threadlist[0]
            thread.stop()
            cgv.threadlist.remove(thread)
        
    def OnDBCheck(self,event):
        '''
        :僅僅查看數據庫不具有編輯數據庫的功能
        :param event:按鈕事件
        '''
        CheckDB(edit=False)
    
    def OnSysSet(self, event):
        '''
        :系統設置窗口
        :功能:設置代理、閾值等屬性信息
        :param event:按鈕事件
        '''
        ss = SysSetting(self)
        ss.ShowModal()                                      #主界面顯示
        ss.Destroy()
    
    def OnDataEdit(self, event):
        '''
        :查看和編輯數據庫
        :param event:按鈕事件
        '''
        CheckDB(edit=True)
    
    def OnPreferenceSet(self,event):
        pass
    
    def OnNewIn(self,event):
        pass
    
    def OnNewWord(self,event):
        pass
    
    def OnTaproot(self,event):
        pass
    
    def OnTrend(self,event):
        pass
    
    def OnAbout(self, event):
        '''
        :顯示軟件的功能等信息
        :param event:事件值
        '''
        dlg = About(self)
        dlg.ShowModal()                                     #顯示「關於」窗口
        dlg.Destroy()
        
    def OnUpdate(self,event):
        pass
    
    def OnHelp(self,event):
        pass

class Main():
    '''
    :主界面程序入口
    '''
    app = wx.App(False)                                     #建立wx app
    frm = MainWindow()
    frm.Show()
    app.MainLoop()
    
if __name__ == '__main__':
    Main()
相關文章
相關標籤/搜索