• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 51, 文章 - 1, 評論 - 41, 引用 - 0
            數據加載中……

            Python寫的簡易代碼統計工具(3)

            本文介紹代碼統計工具的窗口界面,使用wxPython庫實現了簡易界面,見下圖:



            用wxPython編寫界面,可以分為以下四步:
            第一步:搭好框架,定義wx.App類和wx.Frame類的子類。
            第二步:創建控件。
            第三步:綁定消息。
            第四步:編寫響應消息的函數。
            界面編寫只懂些皮毛,所以這個程序只是實現了功能,并沒有什么出彩的地方。
            下面是CodeCounterW.pyw文件中的代碼:

            # -*- coding: cp936 -*-
            '''
            這是一個用Python寫的簡易代碼統計工具。
            作者:lemene
            網址:http://www.cppblog/lemene
            '''
            import wx
            import os
            from counter import CodeCounter

            # 代碼類型和對應的文件后綴名
            codetyps = [['C','Python'],
                        [
            '.c,.cpp,.h','.py']]

            class ResultList(wx.ListCtrl):
                
            '''顯示結果的控件'''
                
            def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
                             size
            =wx.DefaultSize, style=wx.LC_REPORT):
                    wx.ListCtrl.
            __init__(self, parent, ID, pos, size, style)
                    self.InsertColumn(0, 
            "文件名")
                    self.InsertColumn(
            1"總行數")
                    self.InsertColumn(
            2"代碼")
                    self.InsertColumn(
            3"注釋")
                    self.InsertColumn(
            4"空行")

                
            def Clear(self):
                    
            '''清空結果'''
                    self.DeleteAllItems()

                
            def ShowResult(self, results):
                    
            '''顯示結果'''
                    i 
            = 0
                    
            for res in results:
                        self.InsertStringItem(i, res[0])
                        self.SetStringItem(i, 
            1, str(res[1][4]))
                        self.SetStringItem(i, 
            2, str(res[1][1]+res[1][3])) 
                        self.SetStringItem(i, 
            3, str(res[1][2]+res[1][3])) 
                        self.SetStringItem(i, 
            4, str(res[1][0]) )

            class CounterFrame(wx.Frame):
                
            '''程序界面'''
                
            def __init__(self, parent, title):
                    wx.Frame.
            __init__(self, parent, -1, title, size=(495435),
                                      style
            =wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

                    
            # 添加界面控件
                    panel = wx.Panel(self)
                    
            # 第一行控件
                    text1 = wx.StaticText(panel, -1"代碼類型:",style=wx.ALIGN_RIGHT)
                    cb1 
            = wx.ComboBox(panel, -1, codetyps[0][0],choices=codetyps[0],style=wx.CB_READONLY, size=(100,-1))
                    text2 
            = wx.StaticText(panel, -1"后綴名:")
                    cb2 
            = wx.ComboBox(panel, -1, codetyps[1][0],choices=codetyps[1],size=(190,-1))
                    
                    sizer1 
            = wx.BoxSizer(wx.HORIZONTAL)
                    sizer1.Add(text1, 0, wx.RIGHT
            |wx.LEFT, 10)
                    sizer1.Add(cb1, 0, wx.RIGHT
            |wx.LEFT, 10)
                    sizer1.Add(text2, 0, wx.RIGHT
            |wx.LEFT, 10)
                    sizer1.Add(cb2, 0, wx.RIGHT
            |wx.LEFT, 10)
                    
                    
            # 第二行控件
                    rb = wx.RadioBox(panel, -1"", wx.DefaultPosition, wx.DefaultSize,
                            [
            '目錄','文件'])
                    ckb 
            = wx.CheckBox(panel, -1"包括子目錄")
                    fordtx 
            = wx.TextCtrl(panel, -1"", size=(190-1))
                    openfdbtn 
            = wx.Button(panel, -1"", size=(25,25))
                    
                    sizer2 
            = wx.BoxSizer(wx.HORIZONTAL)
                    sizer2.Add(rb, 0, wx.RIGHT
            |wx.LEFT|wx.ALIGN_CENTER , 10)
                    sizer2.Add(ckb, 0, wx.RIGHT
            |wx.LEFT|wx.ALIGN_CENTER , 10)
                    sizer2.Add(fordtx, 0, wx.RIGHT
            |wx.LEFT|wx.ALIGN_CENTER , 10)
                    sizer2.Add(openfdbtn, 0, wx.RIGHT
            |wx.LEFT|wx.ALIGN_CENTER , 10)

                    
            # 第三行控件
                    rzlist = ResultList(panel, -1, size=(470,250))

                    
            # 第四行控件
                    countbtn = wx.Button(panel, -1"統計")
                    savebtn 
            = wx.Button(panel, -1"保存")
                    aboutbtn 
            = wx.Button(panel, -1"關于")
                    sizer4 
            = wx.BoxSizer(wx.HORIZONTAL)
                    sizer4.Add(countbtn, 0, wx.RIGHT
            |wx.LEFT, 40)
                    sizer4.Add(savebtn, 0, wx.RIGHT
            |wx.LEFT, 40)
                    sizer4.Add(aboutbtn, 0, wx.RIGHT
            |wx.LEFT, 40)

                    
            # 排列這四行控件
                    sizer = wx.BoxSizer(wx.VERTICAL)
                    sizer.Add(sizer1, 0, wx.ALL, 
            8)
                    sizer.Add(sizer2, 0, wx.ALL, 
            8)
                    sizer.Add(rzlist, 0, wx.ALL, 
            8)
                    sizer.Add(sizer4, 0, wx.ALL, 
            8)
                    panel.SetSizer(sizer)
                    panel.Layout()

                    
            # 控件消息
                    self.Bind(wx.EVT_BUTTON, self.OnOpenForD, openfdbtn)
                    self.Bind(wx.EVT_BUTTON, self.OnCount, countbtn)
                    self.Bind(wx.EVT_BUTTON, self.OnSave, savebtn)
                    self.Bind(wx.EVT_BUTTON, self.OnAbout, aboutbtn)
                    self.Bind(wx.EVT_COMBOBOX, self.OnChoiceCodeType, cb1)
                    
                    
            # 保存控件引用
                    self.codetype_cb = cb1
                    self.filetype_cb 
            = cb2
                    self.fordname_tx 
            = fordtx
                    self.ford_rb 
            = rb
                    self.subdir_ckb 
            = ckb
                    self.result_list 
            = rzlist

                    
            # 存放結果
                    self.result = []

                
            def OnOpenForD(self, evn):
                    
            '''得到需要統計的文件或目錄的路徑'''
                    
            if self.ford_rb.GetSelection() == 0:
                        dlg 
            = wx.DirDialog(self, "選擇目錄:",
                                           style
            =wx.DD_DIR_MUST_EXIST
                                           )
                    
            else:
                        dlg 
            = wx.FileDialog(
                            self, message
            ="選擇文件",
                            defaultDir
            ="",
                            defaultFile
            ="",
                            style
            =wx.OPEN | wx.CHANGE_DIR
                            )
                    
            if dlg.ShowModal() == wx.ID_OK:
                        self.fordname_tx.SetValue(dlg.GetPath())
                        
                    dlg.Destroy()
                    
                
            def OnCount(self, evn):
                    
            '''統計代碼'''
                    self.result_list.Clear()
                    self.result 
            = []

                    
            try:
                        counter 
            = CodeCounter(codefiles=[])
                        self.SetCounter(counter)
                        counter.Count(self.result)
                    
            except:
                        self.ErrMsg(
            "輸入錯誤")            
                    
                    all 
            = [0,0,0,0,0]
                    
            for ele in self.result:
                        
            for i in range(len(ele[1])):
                            all[i] 
            += ele[1][i]
                    self.result.append([
            '總計', all])
                    
                    self.result_list.ShowResult(self.result)

                
            def OnSave(self, evn):
                    
            '''保存統計結果'''
                    dlg 
            = wx.FileDialog(
                        self, message
            ="Choose a file",
                        defaultDir
            ="",
                        defaultFile
            ="",
                        wildcard
            ="TXT files (*.txt)|*.txt|All files (*.*)|*.*",
                        style
            =wx.SAVE 
                        )
                    
                    
            if dlg.ShowModal() == wx.ID_OK:
                        f 
            = open(dlg.GetPath(), 'wt')
                        
            for res in self.result:
                            f.write((
            "%d\t%d\t%d\t%d\t%s\n" % (res[1][4],res[1][1]+res[1][3],
                                    res[
            1][2]+res[1][3], res[1][0], res[0])))
                            
                    dlg.Destroy()

                
            def OnChoiceCodeType(self, evn):
                    idx 
            = self.codetype_cb.GetSelection()
                    self.filetype_cb.SetSelection(idx)

                
            def OnAbout(self, evn):
                    dlg 
            = wx.MessageDialog(self, __doc__,
                                           
            'About',
                                           wx.OK 
            | wx.ICON_INFORMATION
                                           )
                    dlg.ShowModal()
                    dlg.Destroy()

                
            def ErrMsg(self,msg):
                    dlg 
            = wx.MessageDialog(self, msg,
                                           
            'Err',
                                           wx.OK 
            | wx.ICON_INFORMATION
                                           )
                    dlg.ShowModal()
                    dlg.Destroy()
                    
                
            def SetCounter(self, counter):
                    
            '''從界面讀入配置設置統計工具'''
                    
            if self.subdir_ckb.IsChecked(): # 是否包含子目錄
                        counter.SetLevel(-1)

                    
            if self.fordname_tx.GetValue() != '':
                        
            # 判斷是選擇文件還是目錄
                        t = 'f'     
                        
            if self.ford_rb.GetSelection() == 0:
                            t 
            = 'd'
                        counter.AddCodeFiles(t, self.fordname_tx.GetValue())

                    
            # 設置要統計的代碼類型
                    val = self.codetype_cb.GetValue()
                    
            if val == 'C':
                        counter.SetCodeType(
            'c')
                    
            elif val == 'Python':
                        counter.SetCodeType(
            'py')
                    
                    
            # 設置后綴名
                    counter.SetModes(self.filetype_cb.GetValue())

            class CounterApp(wx.App):
                
            def OnInit(self):
                    frame 
            = CounterFrame(None, "代碼計算器")
                    self.SetTopWindow(frame)
                    frame.Show(True)
                    
            return True

            if __name__ == '__main__':
                app 
            = CounterApp(redirect=False)
                app.MainLoop()
                    

            posted on 2008-01-11 21:14 lemene 閱讀(604) 評論(0)  編輯 收藏 引用

            国产精品一久久香蕉国产线看观看| 久久精品三级视频| 亚洲国产精品狼友中文久久久| 亚洲国产精品无码久久久久久曰| 色99久久久久高潮综合影院| 久久久无码一区二区三区| 国产成人无码精品久久久久免费| 无码乱码观看精品久久| 亚洲欧美日韩久久精品第一区| 久久精品国产半推半就| 思思久久99热只有频精品66| 国产美女久久久| 偷偷做久久久久网站| 国产精品成人无码久久久久久| 九九精品久久久久久噜噜| 国产亚洲婷婷香蕉久久精品| 亚洲精品无码久久久久久| 久久精品三级视频| 狠狠色婷婷综合天天久久丁香| 亚洲国产精品无码久久青草| 国产99久久九九精品无码| 久久久国产乱子伦精品作者| 色8激情欧美成人久久综合电| 久久久综合九色合综国产| 99久久99久久久精品齐齐| 亚洲色欲久久久综合网东京热| 97香蕉久久夜色精品国产| 国产视频久久| 久久久久国产精品| 久久精品国产免费一区| 99久久成人国产精品免费| 久久久久久人妻无码| 久久影院综合精品| 久久99国产精品久久99| 久久久精品2019免费观看| 亚洲国产精品嫩草影院久久| 一本久道久久综合狠狠躁AV| 欧美伊人久久大香线蕉综合| 久久人人爽人人爽人人片AV高清 | 久久青草国产手机看片福利盒子| 久久精品亚洲日本波多野结衣|