python - ToasterBox 的问题,你能 join() 一个计时器或强制一个线程等待计时器在 python 中完成吗

标签 python multithreading wxpython blocking

基本上我正在使用 toasterbox,并且我希望代码运行一次,假设每 30 秒运行一次。每 30 秒 toastr 就会弹出一次。代码如下所示

event = threading.Event()
#############################################
bWidth = 200
bHeight = 100
tb = TB.ToasterBox(self, TB.TB_COMPLEX, TB.DEFAULT_TB_STYLE, TB.TB_ONTIME)

tb.SetPopupSize((bWidth,bHeight))
tb.SetPopupPosition((1600-bWidth,900-bHeight))

tb.SetPopupPauseTime(4000)
tb.SetPopupScrollSpeed(8)
##############################################
while true:

    showPopup(tb,name,amount,progress,link)           
    tb.Play()

    event.wait(30)

这应该会给你一个想法。无论如何,出现的问题是, toastr 弹出,但 tb.play() 不会阻塞,因为它生成一个计时器来处理动画,因此线程立即继续等待函数并阻塞,因此 toastr 永远不会关闭。有没有办法更改播放代码以使其阻塞?或者有更好的方法来做到这一点。我尝试创建一个新线程来运行 tb.play() ,但它抛出了一个只能从主线程运行的错误。有关 toastr 盒的更多信息,包括此处的来源:Toasterbox

最佳答案

您使用的这个 toastr 是什么? wxPython 中包含了一个。看到这里http://xoomer.virgilio.it/infinity77/AGW_Docs/toasterbox_module.html#toasterbox或这里http://www.wxpython.org/docs/api/wx.lib.agw.toasterbox.ToasterBox-class.html

我认为 agw 不支持阻止,我猜您正在使用的也不支持。您可以在 wxPython 邮件列表上询问他们是否可以修补其版本或有更好的建议。就我个人而言,我会使用 wx.Timer 来弹出 toastr 。这应该可以在没有线程的情况下解决你的问题。这里有一个如何使用计时器的示例:http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

关于python - ToasterBox 的问题,你能 join() 一个计时器或强制一个线程等待计时器在 python 中完成吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7407075/

相关文章:

python - 检测窗口的默认媒体播放器

python - wxPython MacOS X Lion 全屏模式

python - 从文件中删除数字

c++ - 从 Qt 中的 QMainWindow 的构造函数启动一个新线程

java - 在调用 Future.get() 之前中断线程

java - 在多线程程序中使用迭代器时出现并发修改异常

python - 更新 wx.Gauge 并使当前帧保持事件状态?

python - 使用 Flask 在本地主机中创建一个 Web 服务器

python - 在 python 3.5 中扩展 logging.Logger 模块

python - 如何访问 wagtail 页面模型中的请求对象?