Entladen von Kivy Builder Regeln mehr als einmal, um GUI-Elemente aus Dateien neu zu importierenPython

Python-Programme
Anonymous
 Entladen von Kivy Builder Regeln mehr als einmal, um GUI-Elemente aus Dateien neu zu importieren

Post by Anonymous »

Ich möchte optionale GUI -Elemente importieren, die in separaten Mod1.py /definiert sind

Code: Select all

Mod2.py
/etc Dateien und fügen Sie diese dynamisch von der Haupt -GUI hinzu. Die separaten Dateien, die diese optionalen GUI -Elemente definieren, enthalten KV Zeichenfolgen. In meinem Anwendungsfall können diese GUI -Elemente mehrmals entladen/neu geladen werden. Ich habe festgestellt, dass, wenn ich in den Dateien modx.py identisch genannte Klassen genannt habe, das Übersprechen zwischen den Modulen erstellt, da Builder.load_string kumulativ funktioniert. Der Hintergrund zu dieser Entdeckung ist hier - Importieren mehrerer Module, die eine identisch benannte Klasse in Python < /p>
Kivy Builder enthalten

Code: Select all

Builder.load_string("""""", filename="myrule.kv")< /code>
und später zum Entladen -
Builder.unload_file("myrule.kv")< /code>
Wenn ich dies versuche, scheint es jedoch nur beim ersten Mal zu funktionieren und ein anderes geladen wird. Danach werden die optionalen GUI -Elemente beim Nachladen nicht mehr angezeigt. Das folgende Beispiel zeigt dies. < /P>
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()
Builder.unload_file("foo.kv")

if "1" in hint:
self.module = importlib.import_module("Mod1").Module()
if "2" in hint:
self.module = importlib.import_module("Mod2").Module()

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('''
:
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)])
''', filename="foo.kv")

class Module(FloatLayout):

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

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

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

Builder.load_string('''
:
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)])
''', filename="foo.kv")

class Module(FloatLayout):

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

def dummymethod2(self):
pass
< /code>
I would like to know if there is a way to make this work properly. Perhaps I am missing something about the way Kivy builder functions?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post