gpt4 book ai didi

python - wxPython 和 windows 7 任务栏

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:22 30 4
gpt4 key购买 nike

为了简洁起见:我正在尝试实现 this使用 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,现在它可以工作了。但是,我仍然不明白为什么 GetHandle 返回一个整数,而 winId 返回一个对象。在 .idl 文件中,参数 hwnd 在所有函数定义中都声明为 long。也许这也是一个简单的问题;)有什么想法吗?

最佳答案

在下面一行:

hWnd = self.panel.GetId()

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

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

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

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

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

关于python - wxPython 和 windows 7 任务栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630440/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com