【问题标题】:wxPython and windows 7 taskbarwxPython 和 windows 7 任务栏
【发布时间】:2011-10-03 01:48:55
【问题描述】:

为简洁起见:我正在尝试使用 wxPython 实现 this,但我正在努力将该代码放入基于 wxPython 的脚本中。

我的简单 PyQt 测试代码运行良好。这里是:

from PyQt4 import QtGui
from threading import Thread
import time
import sys
import comtypes.client as cc
import comtypes.gen.TaskbarLib as tbl

TBPF_NOPROGRESS = 0
TBPF_INDETERMINATE = 0x1
TBPF_NORMAL = 0x2
TBPF_ERROR = 0x4
TBPF_PAUSED = 0x8

cc.GetModule("taskbar.tlb")
taskbar = cc.CreateObject("{56FDF344-FD6D-11d0-958A-006097C9A090}", interface=tbl.ITaskbarList3)

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setWindowTitle("Test")

        self.progress_bar = QtGui.QProgressBar(self)
        self.setCentralWidget(self.progress_bar)
        self.progress_bar.setRange(0, 100)

        self.progress = 0

        self.show()

        thread = Thread(target=self.counter)
        thread.setDaemon(True)
        thread.start()

    def counter(self):
        while True:
            self.progress += 1
            if self.progress > 100:
                self.progress = 0

            time.sleep(.2)

            self.progress_bar.setValue(self.progress)

            taskbar.HrInit()
            hWnd = self.winId()
            taskbar.SetProgressState(hWnd, TBPF_ERROR)        
            taskbar.SetProgressValue(hWnd, self.progress, 100)

app = QtGui.QApplication(sys.argv)
ui = MainWindow()
sys.exit(app.exec_())

但是,当我尝试执行 wxPython 对应项时,任务栏无法按预期工作。这是 wxPython 代码:

import wx
import time
import comtypes.client as cc
import comtypes.gen.TaskbarLib as tbl
from threading import Thread

TBPF_NOPROGRESS = 0
TBPF_INDETERMINATE = 0x1
TBPF_NORMAL = 0x2
TBPF_ERROR = 0x4
TBPF_PAUSED = 0x8

cc.GetModule("taskbar.tlb")
taskbar = cc.CreateObject("{56FDF344-FD6D-11d0-958A-006097C9A090}", interface=tbl.ITaskbarList3)

class MainWindow(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title)

        self.panel = wx.Panel(self)
        self.gauge = wx.Gauge(self.panel)
        self.gauge.SetValue(0)

        self.progress = 0

        self.Show()

        thread = Thread(target=self.counter)
        thread.setDaemon(True)
        thread.start()

    def counter(self):
        while True:
            self.progress += 1
            if self.progress > 100:
                self.progress = 0

            time.sleep(.2)

            self.gauge.SetValue(self.progress)

            taskbar.HrInit()
            hWnd = self.GetHandle()

            taskbar.SetProgressState(hWnd, TBPF_ERROR)
            taskbar.SetProgressValue(hWnd, self.progress, 100)

app = wx.PySimpleApp()
frame = MainWindow(None, wx.ID_ANY, "Test")
app.SetTopWindow(frame)
app.MainLoop()

我认为问题出在 wxWindow 窗口句柄 (hWnd) 方法上,它与 Qt 等效项不同,前者返回一个整数,后者返回一个“sip.voidptr 对象”。

问题是我已经用 wxPython 编写了整个代码(1200 多行),因此我无法重写它以使用 Qt(更不用说不同的许可证)。

你怎么看?我应该放弃吗?
提前非常感谢:)

编辑

感谢罗伯特·奥康纳,现在它可以工作了。但是,我仍然不明白为什么GetHandle 返回一个整数而winId 返回一个对象。在 .idl 文件中,参数 hwnd 在所有函数定义中都声明为 long。也许这也是一个简单的问题;)有什么想法吗?

【问题讨论】:

  • PySide 与 PyQT 相同,但具有更好的许可证...
  • 谢谢,以后会考虑的

标签: python api user-interface windows-7 taskbar


【解决方案1】:

在下面一行:

hWnd = self.panel.GetId()

您想使用GetHandle() 而不是GetId()

编辑:这最初是作为评论发布的,但我想我将其作为答案重新发布会更合适。

关于对您的问题的编辑:如果它现在有效,我想不再有问题了 ;) 好的,但是说真的..

Ints 和 Longs 在 Python 中是统一的,如果我不得不猜测 comtypes 可能会在后台进行一些强制。我不知道在处理一般类型时是否有必要担心这些细节,但在这种情况下似乎并不重要。

现在我没有使用 PyQT 的经验,但是在 Python 中,您可以在对象上定义特殊方法,例如 __int____long__ 来模拟 Ints 和 Longs。如果我不得不猜测,你在 PyQT 中得到的对象定义了其中一种方法。

【讨论】:

  • 对不起,我在谈论 GetHandle,但在我进行了各种测试后忘记编辑代码 :) 事实是现在它可以工作了......我对我的代码做了很多混淆, 我的错。我编辑问题。谢谢!
  • 我确实想指出,感谢您提出这个问题。我有几个原因想要使用任务栏功能,现在我不必费力搞清楚如何了。现在我必须在“需要 IDL 编译器的原因列表”列表中再添加一个原因。
  • 好吧,很高兴我能帮上忙,再次感谢您!我绝对没有考虑 int 方法。我检查了(“dir-ed”对象实例)并找到了它:int(hWnd) 返回一个合理的值。现在一切似乎都更清楚了:)
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2013-07-10
  • 2011-08-03
  • 2011-04-29
相关资源
最近更新 更多