wxPython和windows 7任务栏

时间:2011-10-03 01:48:55

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

为了简洁起见:我正在尝试使用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(不是谈论不同的许可证)。

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

修改

感谢Robert O'Connor,现在它有效。但是,我仍然无法得到GetHandle返回一个整数而winId返回一个对象的原因。在.idl文件中,参数hwnd在所有函数定义中声明为long。也许这也是一个简单的问题;)任何想法?

1 个答案:

答案 0 :(得分:1)

在以下行中:

hWnd = self.panel.GetId()

您想使用GetHandle()代替GetId()

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

关于你的问题的编辑:如果它现在有效,我想已经没有问题了;)好的,但是,认真的..

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

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