• <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 閱讀(603) 評論(0)  編輯 收藏 引用

            久久久久久久久久久久久久| 色综合久久综合网观看| 波多野结衣久久| 久久精品国产亚洲av日韩| 色综合合久久天天综合绕视看| 99久久精品九九亚洲精品| 91久久精品电影| 久久久久亚洲AV成人网人人网站| 久久精品国产2020| 91久久成人免费| 亚洲AV日韩AV永久无码久久| 成人午夜精品久久久久久久小说| 一级做a爰片久久毛片免费陪| 久久w5ww成w人免费| 日本加勒比久久精品| 996久久国产精品线观看| 色综合久久88色综合天天 | 国产精品一区二区久久| 久久久久久亚洲精品影院| 好久久免费视频高清| 亚洲欧美成人综合久久久| 久久精品国产精品亚洲人人 | 亚洲精品乱码久久久久久| 91亚洲国产成人久久精品| 亚洲国产精品高清久久久| 亚洲精品成人久久久| 国产精品久久久99| A级毛片无码久久精品免费| 国产午夜精品久久久久免费视| 久久福利资源国产精品999| 国产视频久久| 久久久久亚洲av毛片大 | 久久久91人妻无码精品蜜桃HD| 国内精品伊人久久久久AV影院| 日本五月天婷久久网站| 伊人久久无码精品中文字幕| 久久AAAA片一区二区| 久久www免费人成精品香蕉| 国产精品日韩深夜福利久久| 97久久精品人人做人人爽| 国产99久久久久久免费看|