您的位置:首页 > 其它

一步步实现cnblogs博客采集工具->实现辅助对话框

2012-10-17 21:11 225 查看
欢迎继续关注开源项目CnblogsFan, 如果你是首次看到这个项目, 点击此处查看有关该项目的详细介绍。

  在前几篇关于CnblogsFan项目的随笔中, 有朋友希望wid能够加快下项目的进度, 并且给出了一些令wid很受用的建议, 在这里, wid向所有关注和支持CnblogsFan开源项目的朋友们表示衷心的感谢。

在继续阅读以下随笔之前, 你应该具备的知识:

  1>. Python的基本语法

  2>. 能够使用WxPython创建一个窗口

  3>.了解WxPython中的"事件"

  4>.了解WxPython中控件的用法

如果你还没有接触过Python语言并且想要了解它, 点击这里;

  今天介绍的是CnblogsFan参数采集第一步的对话框、设置对话框、关于软件对话框的设计, 对于参数采集第二步的对话框, 实际上是一个过滤设置的对话框, 今天由于时间问题还没有能够来得及实现, 对于这个对话框的设计将合并到下一篇关于外围功能的实现的随笔中。

一、参数采集第一步对话框

首先看下3个对话框的效果图:

View Code - SelectUserBlogDlg

由上面的图片示例可知, 当对话框被建立时, 在多行文本输入框中有个初始提示:"每行一个博客地址":

View Code - UseClassificationDlg

二、设置对话框

  由于软件较小, 软件需要设置的参数也不多, 有句话叫"麻雀虽小,五脏俱全", 为了体现一个项目的完整性这里还是要实现下"设置"功能的, 对于需要设置的内容暂时定为采集默认保存目录和采集完成后的提示设置。

看下运行截图:



浏览目录按钮是弹出文件夹选择的对话框, 不过这里实现的仅仅都是些UI部分, 设置对话框的UI代码如下:



#!/usr/bin/python
#coding:utf-8
#-------------------------------------------------------------------------------
# Name:        CnblogsFan_SettingDlg.py
# Purpose:
#
# Author:      Mr.Wid
#
# Created:     17-10-2012
# Copyright:   (c) Mr.Wid 2012
# Licence:     GNU GPL
#-------------------------------------------------------------------------------

import wx

class SettingDlg(wx.Dialog):
def __init__( self, parent = None ):
wx.Dialog.__init__(
self,
parent = parent,
title = u'设置',
size = ( 500, 300 )
)

#-----设置保存目录-----
rect = self.GetClientRect()
self.groupSaveBox = wx.StaticBox(
self,
label = u'采集保存目录设置',
pos = ( rect[0] + 20 , rect[1] + 20 ),
size = ( rect[2] - 40, rect[3] - 200 ),
)
#--提示标签
rect = self.groupSaveBox.Rect
lblSelectTip = wx.StaticText(
self,
label = u'请选择默认保存目录:'
)
lblSelectTip.SetPosition( ( rect[0]+ 20 , rect[1] +  (rect[3] - lblSelectTip.Rect[3] ) / 2 ) )
#--路径文本框
rect = lblSelectTip.Rect
self.txtPath = wx.TextCtrl(
self,
size = ( 200, -1 ),
pos = ( rect[0] + rect[2] + 10, rect[1] - 3 )
)
#--选择目录按钮
rect = self.txtPath.Rect
self.btnSelectPath = wx.Button(
self,
label = u'浏览目录',
size = ( 80, rect[3] + 5 ),
pos = ( rect[0] + rect[2] + 10, rect[1] - 3 )
)
#-----完成提示-----
rect = self.groupSaveBox.Rect
self.groupTipBox = wx.StaticBox(
self,
label = u'任务完成提示设置',
pos = ( rect[0] , rect[1] + rect[3] + 10 ),
size = ( rect[2], rect[3] )
)
self.chkSoundTip = wx.CheckBox(
self,
label = u'声音提示'
)
rect = self.groupTipBox.Rect
self.chkSoundTip.SetPosition( ( rect[0] + 30, rect[1] + (rect[3] - self.chkSoundTip.Rect[3]) / 2 + 5 ) )
self.chkWindowTip = wx.CheckBox(
self,
label = u'窗口提示'
)
rect = self.chkSoundTip.Rect
self.chkWindowTip.SetPosition( ( rect[0] + rect[2] + 30, rect[1] ) )

#-----保存取消按钮-----
rect = self.GetClientRect()
self.btnSaveSetting = wx.Button(
self,
label = u'保存设置',
size = ( 80, 30 )
)
self.btnCancelSetting = wx.Button(
self,
label = u'取消',
size = ( 80, 30 )
)
self.btnSaveSetting.SetPosition( ( ( rect[2] - self.btnCancelSetting.Rect[2] ) / 2 - 80 , rect[3] - 50  ) )
self.btnCancelSetting.SetPosition( ( ( rect[2] + self.btnCancelSetting.Rect[2] ) / 2, rect[3] - 50  ) )

def test():
app = wx.PySimpleApp()
dlg = SettingDlg()
dlg.ShowModal()

if __name__ == '__main__':
test()




代码较短, 也不复杂, 主要就是计算相关控件坐标部分可能有些稍微难以理解, 坐标的计算原则依然是根据上次所说的那样, 根据上一个控件的RECT结构计算下一个控件的位置, 实际上你也可以直接忽略计算过程, 仅将其看做一个具体的数值, 这样不会影响对代码的阅读了。

三、关于软件对话框

  几乎所有的应用软件都有"关于软件"对话框, 这里我们也不能太寒酸不是, 所以我们也设计了一个关于软件的对话框用来对软件做下简单的介绍, 先来预览下我们设计"关于", 如图:



在这个关于对话框中, 我们主要进行了将位图文件显示在对话框中、建立了一个软件信息说明的静态框和一个选项卡以及一个确定按钮, 实现的过程如下:



#!/usr/bin/python
#coding:utf-8
#-------------------------------------------------------------------------------
# Name:        CnblogsFan_AboutDlg.py
# Purpose:
#
# Author:      Mr.Wid
#
# Created:     17-10-2012
# Copyright:   (c) Mr.Wid 2012
# Licence:     GNU GPL
#-------------------------------------------------------------------------------

import wx

#软件的相关介绍
CnblogsFan_Introduction = u'''CnblogsFan是一款完全开源的绿色软件, 用于采集Cnblogs(博客园)上的随笔.

*蜘蛛模式:
采集Cnblogs上的所有随笔。

*指定采集:
采集指定用户的随笔。

*分类采集:
采集首页的各大分类中的随笔。

*过滤功能:
轻松找到令您感兴趣的随笔。

作者:   Mr.Wid
博客:   http://www.cnblogs.com/mr-wid E-mail: mr_wid@163.com
'''

#协议声明文字
CnblogsFan_License = u'''采用GNU General Public License version 3开源协议.

协议在线阅读: http://www.gnu.org/licenses/gpl-3.0.html 
CnblogsFan项目下载: https://github.com/mrwid/CnblogsFan '''

#其他说明, 暂时还没有写
CnblogsFan_Others = '''
'''

class AboutDlg(wx.Dialog):
def __init__( self, parent = None ):
wx.Dialog.__init__(
self,
parent = parent,
title = u'关于',
size = (400, 500)
)
self.lblImage()        #显示图片
self.boxInf()         #显示关于软件信息
#-----创建控件-----
#--CnblogsFan文字图片
def lblImage(self):                  #显示图片方法
img = wx.Image('src/CnblogsFan_TextCnblogsFan.png', wx.BITMAP_TYPE_ANY)
width = img.GetWidth()
CnblogsFanImage = wx.StaticBitmap(
self,
-1,
wx.BitmapFromImage(img),
pos = ( (400 - width) / 2 - 5, 20 )
)
#--软件信息
def boxInf(self):                    #软件信息方法
self.groupBox = wx.StaticBox(
self,
label = u'信息',
pos = ( 15, 110 ),
size = ( 365, 140 )
)
rect = self.groupBox.Rect
self.lblVersion = wx.StaticText(         #软件版本
self,
label = u'版本:    1.0.0',
pos = ( rect[0] + 20, rect[1] + 30 )
)
rect = self.lblVersion.Rect
self.lblAuthor = wx.StaticText(         #作者
self,
label = u'作者:    Mr.Wid',
pos = ( rect[0], rect[1] + 25 )
)
rect = self.lblAuthor.Rect
self.lblWidEmail = wx.StaticText(        #E-mail
self,
label = u'E-mail:',
pos = ( rect[0], rect[1] + 25 )
)
rect = self.lblWidEmail.Rect
self._lblLinkWid = wx.HyperlinkCtrl(      #定义一个超链接
self,
id = -1,
label = u'mr_wid@163.com',
url = u'mailto:mr_wid@163.com',
pos = ( rect[0] + rect[2] + 10, rect[1] )
)
rect = self.lblWidEmail.Rect
self.lblWidBlog = wx.StaticText(         #wid的博客地址
self,
label = u'博客:    ',
pos = ( rect[0], rect[1] + 25 )
)
rect = self.lblWidBlog.Rect
self.lblLinkWidBlog = wx.HyperlinkCtrl(     #建立一个指向博客地址的超链接
self,
id = -1,
label = u'http://www.cnblogs.com/mr-wid',
url = u'http://www.cnblogs.com/mr-wid',
pos = ( rect[0] + rect[2], rect[1] )
)

#--建立一个选项卡
rect = self.groupBox.Rect
self.noteBook = wx.Notebook(
self,
-1,
pos = ( rect[0], rect[1] + rect[3] + 10 ),
size=( rect[2], 170 ),
style = wx.NB_FIXEDWIDTH
)
    #建立三个文本框用于输出文字
txtIntroduction = wx.TextCtrl(        #介绍
self.noteBook,
-1,
style = wx.MULTIPLE|wx.TE_READONLY
)
txtLicense = wx.TextCtrl(            #协议
self.noteBook,
-1,
style = wx.MULTIPLE|wx.TE_READONLY
)
txtOthers = wx.TextCtrl(            #其他
self.noteBook,
-1,
style = wx.MULTIPLE|wx.TE_READONLY
)
     #将文本框添加到选项卡
self.noteBook.AddPage( txtIntroduction, u"介绍" )
self.noteBook.AddPage( txtLicense, u"协议" )
self.noteBook.AddPage( txtOthers, u"其他" )

#设置介绍、协议、其他文本框中的内容
txtIntroduction.SetValue(CnblogsFan_Introduction)
txtLicense.SetValue(CnblogsFan_License)
txtOthers.SetValue(CnblogsFan_Others)

#------确定按钮------
rect = self.GetClientRect()
self._btnOK = wx.Button(
self,
id = wx.ID_OK,
label = u"确定",
pos = ( (rect[2] - 60) /2 , rect[3] - 40 ),
size = ( 60, 30 )
)

def test():
app = wx.PySimpleApp()
aboutDlg = AboutDlg()
aboutDlg.ShowModal()

if __name__ == '__main__':
test()




与其他几个对话框不同, 这里的对话框初始化方法使用了调用两个类成员函数来完成, 避免了__init__方法中堆积大量代码, 也利于以后的对话框中的控件位置调整。

所有项目文件均在GitHub上, 项目地址: https://github.com/mrwid/CnblogsFan


-----[b]---------------[/b]

  最新的项目进展欢迎关注wid的博客, 或者从GitHub上获得最新的项目代码, 如果您对CnblogsFan项目有任何的意见或建议, 恳请提出, wid一定会根据您的意见或建议调整、改进相关的不足之处, 同时, 也希望能够与各位朋友共同交流、进步。

wid, 2012.10.17

上一篇: 开源->一步步实现cnblogs博客采集工具->实现主界面布局
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: