как создать миксин tkinter как синглтон - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать коллекцию форм многократного использования, используя python3 tkinter, используя mixin для общих методов, таких как команды меню и т. Д. Поскольку mixin используется в большинстве компонентов, он создает несколько отдельных экземпляров класса mixin.но мои попытки превратить миксин в синглтон потерпели неудачу с TypeError: object() takes no parameters

Я старый программист на коболе, который начал этот проект, чтобы попытаться обойти мою голову - это заставляет мою голову болеть

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

PROGRAM_NAME = "GuiMenuMixin"

class Base(object):
    def __init__(self, *args, **kwargs): pass

class GuiMenuMixin(Base):

    _singleton = None
    def __new__(cls,*args, **kwargs):
        if not cls._singleton:
            cls._singleton = super().__new__(cls,*args,**kwargs)
        return cls._singleton

    def __init__(self):
        try:
            self.initialProgramName
        except AttributeError: 
             try:
                self.programName  
                self.initialProgramName = self.programName   
            except AttributeError: 
                self.programName = PROGRAM_NAME

# pretty basic mixin stuff follows

# sample usage which fails

class SimpleTitleBarFrame(Frame, GuiMenuMixin):

    def __init__(self, parent=None,  **args):

        super().__init__(parent, **args)

        try: self.programName
        except AttributeError: self.programName = PROGRAM_NAME

        GuiMenuMixin.__init__(self)

        self.parent=parent

############## stuff removed


        leftMenu = SimpleMenuBarFrame(self, menuSpec=self.menuSpec, style="BW.TLabel")
        leftMenu.grid(row=0,column=6,sticky=W)
        self.columnconfigure(6, weight=0)


        rightIcons = SimpleIconBarFrame(self, iconSpec=self.iconSpec)
        rightIcons.grid(row=0,column=10,sticky=W)
        self.columnconfigure(10, weight=0)


#### This runs ok as it does not call any child frames utilising the mixin

PROGRAM_NAME = "SimpleMenuBarFrame"

class SimpleMenuBarFrame(Frame, GuiMenuMixin,):

    def __init__(self, parent=None, **args):
        super().__init__(parent, **args)

        try:
            self.programName                                                     
        except AttributeError: 
            self.programName = PROGRAM_NAME

        GuiMenuMixin.__init__(self)

        self.menuBar = self.makeMenu(menuSpec=self.menuSpec)

Ошибка:

TypeError: object() takes no parameters

...