Importieren mehrerer Module, die eine identisch benannte Klasse in Python enthaltenPython

Python-Programme
Anonymous
 Importieren mehrerer Module, die eine identisch benannte Klasse in Python enthalten

Post by Anonymous »

Ich möchte optionale GUI -Elemente importieren, die in separaten .py -Dateien definiert sind und diese dynamisch von der Haupt -GUI hinzufügen/entfernen. Die optionalen Elemente sind in einer Textkonfigurationsdatei definiert und daher sind die Dateinamen im Voraus nicht bekannt. Meine ursprüngliche Idee war es, ein gemeinsames Format aufzuerlegen - die Hauptklasse würde in allen Moduldateien identisch genannt werden. Ich fand heraus, dass die einfachste Implementierung dieses Verhaltens auf unerwartete Weise verhält. Obwohl die importierten Objekte unterschiedliche Namen zu haben scheinen, gibt es tatsächlich Übersprechen. Dies zeigt das Problem und eine Problemumgehung, die ich auf SE gefunden habe (kommentiert): < /p>

Code: Select all

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.lang import Builder
import importlib

Builder.load_string('''
:
orientation: 'vertical'
BoxLayout:
Button:
text: "Load Mod 1"
on_press:
root.load_module(self.text)
Button:
text: "Load Mod 2"
on_press:
root.load_module(self.text)
Button:
text: "Unload all"
on_press:
dock.clear_widgets()
FloatLayout:
id: dock
''')

class MainWidget(BoxLayout):

def load_module(self, hint):

self.ids.dock.clear_widgets()

if "1" in hint:
self.module = importlib.import_module("Mod1").Module()#PROBLEMATIC
#module = importlib.import_module("Mod1")
#class_ = getattr(module, "Module1")
#self.module = class_()
if "2" in hint:
self.module = importlib.import_module("Mod2").Module()#PROBLEMATIC
#module = importlib.import_module("Mod2")
#class_ = getattr(module, "Module2")
#self.module = class_()

self.ids.dock.add_widget(self.module)

class MyApp(App):
def build(self):
return MainWidget()

if __name__ == '__main__':
MyApp().run()
< /code>
Mod1.py
:

Code: Select all

from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string('''
#:
: #PROBLEMATIC
size_hint: None, None
size: self.parent.size if self.parent else self.size
pos: self.parent.pos if self.parent else self.pos
Button:
size_hint: None, None
width: self.parent.width / 3
height: self.parent.height
pos: self.parent.pos
text: "Mod 1"
on_press: print(root); print([x for x in dir(root) if 'method' in str(x)])
''')

#class Module1(FloatLayout):
class Module(FloatLayout): #PROBLEMATIC

def __init__(self, **kwargs):
super(FloatLayout, self).__init__(**kwargs)

def dummymethod1(self):
pass
< /code>
Mod2.py
:

Code: Select all

from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string('''
#:
: #PROBLEMATIC
size_hint: None, None
size: self.parent.size if self.parent else self.size
pos: self.parent.pos if self.parent else self.pos
Button:
size_hint: None, None
width: self.parent.width / 3
height: self.parent.height
pos: (self.parent.x + self.parent.width / 2) , self.parent.y
text: "Mod 2"
on_press: print(root); print([x for x in dir(root) if 'method' in str(x)])
''')

#class Module2(FloatLayout):
class Module(FloatLayout): #PROBLEMATIC

def __init__(self, **kwargs):
super(FloatLayout, self).__init__(**kwargs)

def dummymethod2(self):
pass
< /code>
It appears that although the modules have distinct names Mod1
und mod2 Die Hauptklasse mit demselben Namen ist ein Problem. Sobald beide Module mindestens einmal importiert wurden, erscheinen beide in der GUI, unabhängig davon, welcher tatsächlich aktiviert ist. Hat dies damit zu tun, wie das Import in Python im Allgemeinen oder mit einem kivy spezifischen Problem funktioniert? Gibt es eine andere Möglichkeit, damit umgehen zu können>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post