• <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, 評(píng)論 - 41, 引用 - 0
            數(shù)據(jù)加載中……

            Python寫(xiě)的簡(jiǎn)易代碼統(tǒng)計(jì)工具(3)

            本文介紹代碼統(tǒng)計(jì)工具的窗口界面,使用wxPython庫(kù)實(shí)現(xiàn)了簡(jiǎn)易界面,見(jiàn)下圖:



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

            # -*- coding: cp936 -*-
            '''
            這是一個(gè)用Python寫(xiě)的簡(jiǎn)易代碼統(tǒng)計(jì)工具。
            作者:lemene
            網(wǎng)址:http://www.cppblog/lemene
            '''
            import wx
            import os
            from counter import CodeCounter

            # 代碼類型和對(duì)應(yīng)的文件后綴名
            codetyps = [['C','Python'],
                        [
            '.c,.cpp,.h','.py']]

            class ResultList(wx.ListCtrl):
                
            '''顯示結(jié)果的控件'''
                
            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"總行數(shù)")
                    self.InsertColumn(
            2"代碼")
                    self.InsertColumn(
            3"注釋")
                    self.InsertColumn(
            4"空行")

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

                
            def ShowResult(self, results):
                    
            '''顯示結(jié)果'''
                    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"統(tǒng)計(jì)")
                    savebtn 
            = wx.Button(panel, -1"保存")
                    aboutbtn 
            = wx.Button(panel, -1"關(guān)于")
                    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

                    
            # 存放結(jié)果
                    self.result = []

                
            def OnOpenForD(self, evn):
                    
            '''得到需要統(tǒng)計(jì)的文件或目錄的路徑'''
                    
            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):
                    
            '''統(tǒng)計(jì)代碼'''
                    self.result_list.Clear()
                    self.result 
            = []

                    
            try:
                        counter 
            = CodeCounter(codefiles=[])
                        self.SetCounter(counter)
                        counter.Count(self.result)
                    
            except:
                        self.ErrMsg(
            "輸入錯(cuò)誤")            
                    
                    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([
            '總計(jì)', all])
                    
                    self.result_list.ShowResult(self.result)

                
            def OnSave(self, evn):
                    
            '''保存統(tǒng)計(jì)結(jié)果'''
                    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):
                    
            '''從界面讀入配置設(shè)置統(tǒng)計(jì)工具'''
                    
            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())

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

            class CounterApp(wx.App):
                
            def OnInit(self):
                    frame 
            = CounterFrame(None, "代碼計(jì)算器")
                    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) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            中文字幕久久亚洲一区| 狠狠精品久久久无码中文字幕| 午夜精品久久久久久毛片| 久久人妻少妇嫩草AV无码蜜桃| 老司机国内精品久久久久| 国产精品久久久久aaaa| 久久综合香蕉国产蜜臀AV| 亚洲国产欧洲综合997久久| 久久久精品久久久久影院| 97香蕉久久夜色精品国产| 日韩欧美亚洲综合久久影院Ds | 日本五月天婷久久网站| 一本久久免费视频| 欧美激情一区二区久久久| 亚洲欧洲久久久精品| 亚洲欧美国产精品专区久久| 思思久久99热免费精品6| 模特私拍国产精品久久| 精品久久久中文字幕人妻| 亚洲狠狠婷婷综合久久蜜芽| 97精品伊人久久大香线蕉app| 国产精品久久久久影视不卡| 97久久精品人人澡人人爽| 欧美午夜A∨大片久久 | 久久久久亚洲爆乳少妇无| 亚洲成av人片不卡无码久久| 久久久久久久久久久久久久| 久久综合噜噜激激的五月天| 国产一久久香蕉国产线看观看| 国产亚洲美女精品久久久| 人人狠狠综合88综合久久| 久久棈精品久久久久久噜噜| 亚洲国产精品人久久| 久久人人爽人人爽人人爽| 国产精品久久久福利| 麻豆久久| 精品久久久久久久| 麻豆av久久av盛宴av| 免费精品99久久国产综合精品| 久久天天躁狠狠躁夜夜2020老熟妇| 久久久无码精品亚洲日韩京东传媒|