wxPython и панель задач Windows 7 - PullRequest
1 голос
/ 03 октября 2011

Для краткости: я пытаюсь реализовать 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».

Проблема в том, что я уже написал весь код (более 1200 строк) с помощью wxPython, поэтому я не могу переписать его для использования Qt (не говоря о разных лицензиях).

Что вы думаете об этом? Должен ли я сдаться?
Заранее большое спасибо:)

EDIT

Благодаря Роберту О'Коннору, теперь это работает. Однако я до сих пор не могу понять, почему GetHandle возвращает целое число, а winId возвращает объект. В файле .idl аргумент hwnd объявлен как long во всех определениях функций. Может быть, это тоже простой вопрос;) Есть идеи?

1 Ответ

1 голос
/ 03 октября 2011

В следующей строке:

hWnd = self.panel.GetId()

Вы хотите использовать GetHandle() вместо GetId().

Редактировать: Первоначально он был опубликован в качестве комментария, но я полагаю, что было бы более подходящим для меня сделать репост в качестве ответа.

Относительно редактирования вашего вопроса: если теперь это работает, я думаю, что больше нет проблем;) Хорошо, серьезно, хотя ..

Ints и Long объединены в Python, и, если бы мне пришлось угадывать, comtipes могли бы делать какое-то принуждение в фоновом режиме. Я не знаю, стоит ли беспокоиться о таких деталях при работе с комтипами в целом, но в данном случае это не имеет большого значения.

Теперь у меня нет опыта работы с PyQT, но в Python вы можете определять специальные методы для таких объектов, как __int__ и __long__, для эмуляции Ints и Longs. Если бы мне пришлось угадывать, объект, который вы получаете в PyQT, определяет один из этих методов.

...