【发布时间】: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