Обертка для перевода текста на wxPython виджеты


Я пишу обертку для все виджеты, которые содержат текст, который нужно перевести на wxPython, В и заставить их обрабатывать первоначального перевода и смены языка на их собственный, используя gettext версии.

У меня уже есть работающий прототип, но я уверен, что это не правильный способ сделать это. Вот пример для всех подклассов wx.Control.

Моя идея состоит в том, чтобы переопределить соответствующие методы wx.Control а затем объединить фактический виджеты (подклассы wx.Control) вместе с моей Control.

import wx
from wx.lib.pubsub import pub

class Control(wx.Control):
    def __init__(self, label):
        self.ml_label = label
        pub.subscribe(self.Update, 'language.changed')

    def Update(self):
        super().Update()
        super().SetLabel(_(self.ml_label))

    def SetLabel(self, label):
        self.ml_label = label
        super().SetLabel(_(self.ml_label))


class Button(wx.Button, Control):
    def __init__(self, parent, id=wx.ID_ANY, label=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0,
                 validator=wx.DefaultValidator, name=wx.ButtonNameStr):
        Control.__init__(self, label)
        wx.Button.__init__(self, parent, id, _(label), pos, size, style, validator, name)


class StaticText(wx.StaticText, Control):
    def __init__(self, parent, id=wx.ID_ANY, label=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0,
                 name=wx.StaticTextNameStr):
        Control.__init__(self, label)
        wx.StaticText.__init__(self, parent, id, _(label), pos, size, style, name)

Раньше у меня был код от Control класс в Button и StaticText но есть много виджетов на основе Control Я хотел перенести дублировать код в одном месте.

Это работает, но я уверен, что это не правильный способ сделать это, тем более, что я не звоню super().__init__ в Control класс, который не может быть правильным.

Я должен даже использовать множественное наследование для того, что я пытаюсь сделать здесь?



Комментарии
1 ответ

После того, как я разместил этот вопрос и увидел, что я написал, что я пытаюсь написать обертку, я думал, что это может быть решением...

import wx
from wx.lib.pubsub import pub

def multilingual(wrapped):

class WrappedClass(wrapped):
def __init__(self, *args, **kwargs):
# Translate label parameter
if len(args) >= 3:
self.ml_label = args[2]
args = list(args)
args[2] = _(self.ml_label)
else:
self.ml_label = kwargs.get('label',wx.EmptyString)
kwargs['label'] = _(self.ml_label)
super().__init__(*args,**kwargs)
pub.subscribe(self.Update, 'language.changed')

def Update(self):
print('update')
super().Update()
super().SetLabel(_(self.ml_label))

def SetLabel(self, label):
print('setlabel')
self.ml_label = label
super().SetLabel(_(self.ml_label))

return WrappedClass

@multilingual
class Button(wx.Button):
pass

@multilingual
class StaticText(wx.StaticText):
pass

0
ответ дан 23 марта 2018 в 04:03 Источник Поделиться