发信人: wolfenstein (NeverSayNever), 个人文集
标 题: BT源代码学习心得(九):客户端源代码分析(图形界面浅析)
发信站: 水木社区 (Fri Aug 12 17:03:19 2005), 文集
标 题: BT源代码学习心得(九):客户端源代码分析(图形界面浅析)
发信站: 水木社区 (Fri Aug 12 17:03:19 2005), 文集
(本文包含HTML标记,终端模式下可能无法正确浏览)
客户端将从btdownloadgui.py开始进行分析,这样可以顺便把Python中的GUI编程也看
一下。Python中的GUI编程也有很多内容,所以不可能深入得分析,仅仅以BT的源代码为例
看一下。
btdownloadgui.py中使用gtk作为其图形界面的开发库。这个库中提供了很丰富的类,
可以来创建图形界面中所需要的各种widget,而在主要的窗口类DownloadInfoFrame的初始
化过程中,程序的主要任务就是创建窗口中要用到的各种各样的widget,并且把它们加入窗
体。然后用connect函数把某个widget上可能会发生的事件与某个处理函数连接起来,这样
,一个GUI界面就建立起来了。具体的过程可以参考gtk的每个类的说明文档,并不困难。
这里再简单介绍一下btdownloadgui.py中的其它的类。它们通常都是GUI界面中的各种
子窗口,需要在某个按钮或者菜单被选中后弹出。我们也可以看到作者在GUI界面方面的设
计的一些巧妙之处。
Validator:在一个基本的Entry上继承的类,但是可以对用户输入的值进行判断,只有
出现在有效字符列表中的输入有效。另外在这个类的基础上还继承了IPValidator,
PortValidator,PercentValidator,MinutesValidator对各种输入数据进行校验。
RateSliderBox:这是一个表示速率的滑动块,可以根据鼠标的调整显示出对应的速度
以及相应的网络连接类型。内部完成了滑块位置和对应速率的转换。
StopStartButton:停止/开始按钮,可以通过点击这个按钮来临时停止或者恢复所有的
种子的下载。
客户端将从btdownloadgui.py开始进行分析,这样可以顺便把Python中的GUI编程也看
一下。Python中的GUI编程也有很多内容,所以不可能深入得分析,仅仅以BT的源代码为例
看一下。
btdownloadgui.py中使用gtk作为其图形界面的开发库。这个库中提供了很丰富的类,
可以来创建图形界面中所需要的各种widget,而在主要的窗口类DownloadInfoFrame的初始
化过程中,程序的主要任务就是创建窗口中要用到的各种各样的widget,并且把它们加入窗
体。然后用connect函数把某个widget上可能会发生的事件与某个处理函数连接起来,这样
,一个GUI界面就建立起来了。具体的过程可以参考gtk的每个类的说明文档,并不困难。
这里再简单介绍一下btdownloadgui.py中的其它的类。它们通常都是GUI界面中的各种
子窗口,需要在某个按钮或者菜单被选中后弹出。我们也可以看到作者在GUI界面方面的设
计的一些巧妙之处。
Validator:在一个基本的Entry上继承的类,但是可以对用户输入的值进行判断,只有
出现在有效字符列表中的输入有效。另外在这个类的基础上还继承了IPValidator,
PortValidator,PercentValidator,MinutesValidator对各种输入数据进行校验。
RateSliderBox:这是一个表示速率的滑动块,可以根据鼠标的调整显示出对应的速度
以及相应的网络连接类型。内部完成了滑块位置和对应速率的转换。
StopStartButton:停止/开始按钮,可以通过点击这个按钮来临时停止或者恢复所有的
种子的下载。
VersionWindow(显示版本信息),AboutWindow(显示关于信息),LogWindow(显示日志)
,SettingsWindow(进行一些参数设置),FileListWindow(文件列表窗口),
PeerListWindow(对等客户列表窗口),TorrentInfoWindow(种子文件信息窗口)都是一个子
窗口,它们在相应的功能被调用时会弹出来,其中LogWindow使用到了LogBuffer中的内容,
即在任何需要记录日志的地方调用LogBuffer的log_text函数,然后LogWindow可以把它们都
显示出来。
TorrentBox是一个种子文件下载任务在图形界面上的表示的基类。里面定义了名称标识
,状态图标,进度条等等GUI元素,所有的下载任务都以这个类为基类。KnownTorrentBox则
是已经不在下载任务列表的图形界面表示,可以把它拖到下载队列中,这样就可以继续下载
这些任务,这有两种情况,把已经完成的任务拖到下载队列中就表示要继续做种,而把已经
失败的任务拖到下载队列中就表示要恢复下载。DroppableTorrentBox是一个增加了托拽对
象处理的类。以DroppableTorrentBox为基类的类有QueuedTorrentBox,PausedTorrentBox
,RunningTorrentBox分别对应了还在队列中的下载任务,暂停的任务和正在运行的任务。
KnownTorrentBox的区域中的项目可以托拽到下载队列中,另外QueuedTorrentBox和
PausedTorrentBox,RunningTorrentBox中的项目可以自由托拽,满足用户对下载任务的队
列管理要求。这里还要提一下,那就是RunningTorrentBox和PausedTorrentBox不能同时出
现,它由开始提到的StopStartButton管理,即暂停/运行所有的任务,而
QueuedTorrentBox是那种由于同时下载的任务的数量的限制而暂时得不到下载的任务,即使
StopStartButton的状态是运行所有任务,它也不会被运行,只有当某个下载任务结束或者
中止后,系统从队列中选取一个进入运行队列。
以上是每一个具体的运行项目对应的widget,下面来看它们的容器,HSeparatedBox是
一个容器的基类,定义在BitTorrent/GUI.py中,这个模块中还定义了其它一些为GUI显示方
,SettingsWindow(进行一些参数设置),FileListWindow(文件列表窗口),
PeerListWindow(对等客户列表窗口),TorrentInfoWindow(种子文件信息窗口)都是一个子
窗口,它们在相应的功能被调用时会弹出来,其中LogWindow使用到了LogBuffer中的内容,
即在任何需要记录日志的地方调用LogBuffer的log_text函数,然后LogWindow可以把它们都
显示出来。
TorrentBox是一个种子文件下载任务在图形界面上的表示的基类。里面定义了名称标识
,状态图标,进度条等等GUI元素,所有的下载任务都以这个类为基类。KnownTorrentBox则
是已经不在下载任务列表的图形界面表示,可以把它拖到下载队列中,这样就可以继续下载
这些任务,这有两种情况,把已经完成的任务拖到下载队列中就表示要继续做种,而把已经
失败的任务拖到下载队列中就表示要恢复下载。DroppableTorrentBox是一个增加了托拽对
象处理的类。以DroppableTorrentBox为基类的类有QueuedTorrentBox,PausedTorrentBox
,RunningTorrentBox分别对应了还在队列中的下载任务,暂停的任务和正在运行的任务。
KnownTorrentBox的区域中的项目可以托拽到下载队列中,另外QueuedTorrentBox和
PausedTorrentBox,RunningTorrentBox中的项目可以自由托拽,满足用户对下载任务的队
列管理要求。这里还要提一下,那就是RunningTorrentBox和PausedTorrentBox不能同时出
现,它由开始提到的StopStartButton管理,即暂停/运行所有的任务,而
QueuedTorrentBox是那种由于同时下载的任务的数量的限制而暂时得不到下载的任务,即使
StopStartButton的状态是运行所有任务,它也不会被运行,只有当某个下载任务结束或者
中止后,系统从队列中选取一个进入运行队列。
以上是每一个具体的运行项目对应的widget,下面来看它们的容器,HSeparatedBox是
一个容器的基类,定义在BitTorrent/GUI.py中,这个模块中还定义了其它一些为GUI显示方
便的函数和对象。HSeparatedBox中可以添加若干子窗口,并且可以对它们进行重新排列,
另外它可以用分割线分割添加进来的子窗口。DroppableBox是HSeparatedBox的子类,它增
加的功能是处理托拽对象离开,KnownBox则又是DroppableBox的子类,它将被填充进若干个
KnownTorrentBox,对应的还有RunningBox和QueuedBox,填充入相应的下载任务的widget(
注意到PausedTorrentBox和RunningTorrentBox不能同时出现,它们都被放在容器
RunningBox),而RunningAndQueueBox是一个同时塞进了RunningTorrentBox和QueuedBox的
容器。
系统中每个TorrentBox保存某个具体种子的信息仅仅是为了显示,当需要的时候,这些
widget都是随时被删除,或者创建,或者进行重新排列,这些种子的随着运行的时间一些统
计信息发生改变,也会通过这些widget显示出来。
BitTorrent/TorrentQueue.py模块完成了从GUI界面到实际的种子下载任务的模块中的
衔接。它实现了Feedback的接口,这样当某个种子的下载任务发生变化(如完成,出错等)后
,可以及时得通知它,然后显示在GUI界面上。通过分析其它的BT的下载程序(即非图形界面
的下载程序,如btdownloadheadless.py等),也可以看到有一个继承了Feedback接口的类,
但是它的实现方式通常是以文字的形式表现出种子的变化。另外,TorrentQueue模块还可以
恢复上次的下载情况(读取一些状态文件),通过所有的下载程序的分析(图形界面的或者文
本的)我们可以认为,实际执行下载任务的对象是BitTorrent/download.py中的
Multitorrent对象为。而TorrentQueue的代码仍然算在GUI部分中,通过分析它的代码,我
们已经知道它已经读取了相应的种子文件中的信息,并且进行了相关的处理。
由于我们主要是要分析BT的客户端的实际功能代码,因此GUI部分只能比较简略得说一
下,其实这部分可以对着gtk的参考手册看相关的图形界面程序的源代码
(btdownloadgui.py,btmaketorrentgui.py),还是比较好分析的。下一次开始就可以分析
另外它可以用分割线分割添加进来的子窗口。DroppableBox是HSeparatedBox的子类,它增
加的功能是处理托拽对象离开,KnownBox则又是DroppableBox的子类,它将被填充进若干个
KnownTorrentBox,对应的还有RunningBox和QueuedBox,填充入相应的下载任务的widget(
注意到PausedTorrentBox和RunningTorrentBox不能同时出现,它们都被放在容器
RunningBox),而RunningAndQueueBox是一个同时塞进了RunningTorrentBox和QueuedBox的
容器。
系统中每个TorrentBox保存某个具体种子的信息仅仅是为了显示,当需要的时候,这些
widget都是随时被删除,或者创建,或者进行重新排列,这些种子的随着运行的时间一些统
计信息发生改变,也会通过这些widget显示出来。
BitTorrent/TorrentQueue.py模块完成了从GUI界面到实际的种子下载任务的模块中的
衔接。它实现了Feedback的接口,这样当某个种子的下载任务发生变化(如完成,出错等)后
,可以及时得通知它,然后显示在GUI界面上。通过分析其它的BT的下载程序(即非图形界面
的下载程序,如btdownloadheadless.py等),也可以看到有一个继承了Feedback接口的类,
但是它的实现方式通常是以文字的形式表现出种子的变化。另外,TorrentQueue模块还可以
恢复上次的下载情况(读取一些状态文件),通过所有的下载程序的分析(图形界面的或者文
本的)我们可以认为,实际执行下载任务的对象是BitTorrent/download.py中的
Multitorrent对象为。而TorrentQueue的代码仍然算在GUI部分中,通过分析它的代码,我
们已经知道它已经读取了相应的种子文件中的信息,并且进行了相关的处理。
由于我们主要是要分析BT的客户端的实际功能代码,因此GUI部分只能比较简略得说一
下,其实这部分可以对着gtk的参考手册看相关的图形界面程序的源代码
(btdownloadgui.py,btmaketorrentgui.py),还是比较好分析的。下一次开始就可以分析
BitTorrent/download.py中的Multitorrent,直奔主题了。