[英]wxPython and windows 7 taskbar
为了简洁起见:我正在尝试使用wxPython实现此功能,但是我正在努力将该代码放入基于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,现在它可以工作了。 但是,我仍然不明白为什么winId
返回一个对象时GetHandle
返回一个整数。 在.idl文件中,参数hwnd在所有函数定义中均声明为long
。 也许这也是一个简单的问题;)有什么想法吗?
在下一行:
hWnd = self.panel.GetId()
您想使用GetHandle()
而不是GetId()
。
编辑:这最初是作为评论发布的,但是我想将它重新发布作为答案会更合适。
关于对您的问题的编辑:如果现在可以正常工作,我想这不再是问题;)好的,不过,很认真。
Int和Longs在Python中是统一的,如果我不得不猜测comtypes可能会在后台进行强制。 我不知道在处理一般字型时是否有必要担心此类细节,但是在这种情况下似乎并不重要。
现在我还没有使用PyQT的经验,但是在Python中,您可以在诸如__int__
和__long__
对象上定义特殊方法来模拟Ints和Longs。 如果我不得不猜测,您在PyQT中获得的对象定义了这些方法之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.