跳转到主要内容

twisting基于带有GTK的twisted延迟线程

项目描述

需求

为了有效使用twisting,需要除了twisted库之外的GTK。然后我们必须在应用程序的主要入口文件开头执行以下导入

# twisted install
from twisted.internet import gtk2reactor
# install the gtk2 reactor
gtk2reactor.install()
# twisted import
from twisted.internet import reactor

在我们用传统的GTK主线程启动应用程序之前

# gtk线程启动 gtk.main()

现在我们使用twisted反应器启动,如下所示

# twisted reactor start
reactor.run()

注意: 主图形窗口必须在反应器启动之前创建,就像GTK一样。

框架概述

twisting框架的GUI部分提供以下功能

1. 显示任务进度的GUI元素
  • taskbox对象:附加到任务,以通知任务进度

  • 进度窗口:包含所有可以隐藏的任务框

  • 进度框:可以在父窗口中使用,以通知平均进度

2. 管理多个任务
  • 添加任务:创建一个线程和一个taskox附加到工作方法

  • 暂停/播放任务:由框架自动管理

  • 停止任务:将标志返回到主循环

  • 从进度窗口中删除任务框(自动停止)

注意:每个任务都与一个显示任务进度状态的GUI小部件相对应

3. 回调
  • 结果回调:在添加任务时设置,并在twisted延迟线程工作循环结束时由它调用

  • 错误回调:在添加任务时设置,并由twisted延迟线程在发生错误时调用

  • 所有任务完成回调:当所有任务完成时由进度窗口调用,可用于消息显示、进度窗口隐藏等

框架最佳实践

在这里,我们将逐步解释框架的标准用法。

1. 创建进度窗口

进度窗口是单例模式,必须在反应器启动之前或使用以下行在 gtk 工作流中创建:

# progress window import
from twisting import ProgressManager
# Progress manager init
ProgressManager(all_finish_callback=on_all_tasks_finished, ui=True)
2. 设置进度条以获取更多信息

进度条可以添加到任何地方,并且将被进度窗口更新以显示平均进度,这取决于当前正在进行的任务。为此,我们创建进度框并将其设置到进度窗口中:

# progress box import
from twisting.gui_worker import ProgressManager
import gtk

# create the box
progress_bar = gtk.ProgressBar()
# add the box
ProgressManager().set_parent(self.main_window, progress_bar)

注意: 我们更喜欢将进度窗口设置为父级,以便使用 gtk 的短暂功能

3. 添加新任务

我们使用添加功能将任务添加到进度窗口。线程和任务框将由进度窗口创建、附加并自动启动。

# add the task
ProgressManager().add_task(
        id_, pretty_name,
        self.task_function,
        end_callback=self.end_callback,
        error_callback=self.error_callback)

一些细节

  • id_ 对应于任务的唯一标识符

  • pretty_name 将在任务框小部件中显示

  • task_function 是使用 twisted 线程化的函数,它应根据 twisting 框架 API 管理任务循环

  • end_callback 是 twisted 接收 task_function 结果的回调

  • error_callback 是 twisted 接收参数中的 twisted 对象失败的错误回调

4. 线程化任务循环函数

循环函数接收相应的任务框作为参数。然后我们必须通知任务框迭代次数以初始化正确的进度比例

# set the number of iterations
taskbox.set_max_pulse(100)

为了隐藏最大程度的线程管理,我们将使用框架提供的 state_method。它应该如下导入:

# state_machine function import
from twisting import state_machine

对于每个任务迭代,此方法将更新进度信息,检查 PauseStop 事件。线程暂停直接在该函数中管理。如果捕获到 Stop 事件,则函数返回 True,这意味着线程化函数必须退出。必须使用任务框实例调用此方法以轮询任务框事件队列:

# IN THE LOOP
# check for stop or pause events
if state_machine(taskbox):
    # we quit
    return stop_result

最后,我们通过 twisted 线程调用任务框完成方法,以停止任务框中的进度并显示结束消息。然后我们返回工作结果,twisted 将将其发送到结果回调

# call the finish action throw the parent event queue
reactor.callFromThread(taskbox.finish)
# we finish
return end_result

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

此发布没有可用的源分布文件。请参阅有关 生成分布存档 的教程。

构建分布

twisting-0.6.3-py2.5.egg (66.0 kB 查看散列)

上传

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面