Можно ли определить wx.Panel как класс в Python? - PullRequest
1 голос
/ 16 февраля 2010

Я хочу определить несколько плагинов. Все они наследуются от плагина суперкласса.

Каждый плагин состоит из wx.Panel, у которого есть более специфический метод, называемый «draw».

Как я могу определить класс как Panel и затем вызвать этот класс в моем фрейме?

Я пробовал вот так:

class Panel(wx.Panel):
    def __init__(self, parent):
        wx.Panel(self, parent)

но это дает мне эту ошибку:

in __init__
    _windows_.Panel_swiginit(self,_windows_.new_Panel(*args, **kwargs))
TypeError: in method 'new_Panel', expected argument 1 of type 'wxWindow *'

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 16 февраля 2010
class MyPanel(wx.Panel):
    def __init__(self, *args):
        wx.Panel.__init__(self, *args)

    def draw(self):
        # Your code here
2 голосов
/ 16 февраля 2010

Существует класс wx.PyPanel, который является версией Panel, предназначенной для создания подклассов из Python, и позволяет переопределять виртуальные методы C ++.

Также существуют версии PyXxxx для ряда других классов wx.

0 голосов
/ 16 февраля 2010

Как я могу определить класс как Panel и затем вызвать этот класс в моем фрейме?

То, что вы пробовали, близко, но вы неправильно называете суперкласс __init__. Однако при создании подклассов классов wxPython лучше всего использовать следующий шаблон, чтобы вам не приходилось беспокоиться о том, какие конкретные аргументы вы ему передаете. (Это не решило бы вашу проблему, которая была за пределами рассматриваемого кода, но, возможно, прояснит, что происходит.)

class Panel(wx.Panel):
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        # ... code specific to your subclass goes here

Это гарантирует, что все переданное будет передано методу суперкласса без добавления или удаления. Это означает, что подпись для вашего подкласса точно совпадает с сигнатурой суперкласса, что также может ожидать кто-то, использующий ваш подкласс.

Если, однако, вы на самом деле ничего не делаете в своем собственном методе __init__(), кроме вызова суперкласса __init__(), вам вообще не нужно предоставлять метод!

Что касается вашего исходного выпуска:

но это дает мне эту ошибку: в __init__ windows.Panel_swiginit(self,windows.new_Panel(*args, **kwargs)) TypeError: in method 'new_Panel', expected argument 1 of type 'wxWindow *'

( Edited ) Вы на самом деле создавали wx.Panel () внутри __init__, а не вызывали суперкласс __init__, как указывал Хавьер (и Брайан Оукли, исправляя меня). (Смена «родительского» аргумента Хавьера на «* args» смутила меня ... извините, что сбила вас с толку.)

...