AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79552332
Accepted
Eugene B
Eugene B
Asked: 2025-04-03 16:06:28 +0800 CST2025-04-03 16:06:28 +0800 CST 2025-04-03 16:06:28 +0800 CST

Descarregando as regras do construtor Kivy mais de uma vez, para reimportar elementos da GUI dos arquivos

  • 772

Gostaria de importar elementos opcionais da GUI definidos em arquivos Mod1.py/ Mod2.py/etc separados e adicioná-los/remover dinamicamente da GUI principal. Os arquivos separados que definem esses elementos opcionais da GUI contêm kvstrings. No meu caso de uso, esses elementos da GUI podem ser descarregados/recarregados várias vezes. Descobri que se eu tiver classes com nomes idênticos nos Modx.pyarquivos, isso cria uma conversa cruzada entre os módulos porque Builder.load_stringfunciona cumulativamente. O pano de fundo para essa descoberta está aqui - Importando vários módulos contendo classes com nomes idênticos em python

A documentação do Kivy Builder sugere que uma determinada kvstring pode ser seletivamente descarregada mais tarde se um pseudo nome de arquivo for fornecido, por exemplo Builder.load_string("""<kv string>""", filename="myrule.kv") , e mais tarde para descarregar - Builder.unload_file("myrule.kv") No entanto, quando tento isso, parece funcionar apenas na primeira vez que um módulo é descarregado e outro é carregado. Depois disso, os elementos opcionais da GUI não aparecem mais quando recarregados. O exemplo a seguir demonstra isso.

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('''
<MainWidget>:
    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()

Mod1.py

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

Builder.load_string('''
<Module>:  
    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

Mod2.py

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

Builder.load_string('''
<Module>:
    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

Gostaria de saber se há uma maneira de fazer isso funcionar corretamente. Talvez eu esteja esquecendo de algo sobre a maneira como o Kivy builder funciona?

python
  • 1 1 respostas
  • 26 Views

1 respostas

  • Voted
  1. Best Answer
    John Anderson
    2025-04-03T21:42:27+08:002025-04-03T21:42:27+08:00

    Acho que o importlibnão importará um módulo se ele já tiver sido carregado. Nesse caso, você pode usar importlib.reload(). Tente modificar sua MainWidgetclasse para fazer isso. Algo como:

    class MainWidget(BoxLayout):
        def __init__(self):
            self.current_module1 = None
            self.current_module2 = None
            super(MainWidget, self).__init__()
    
        def load_module(self, hint):
    
            self.ids.dock.clear_widgets()
            Builder.unload_file("foo.kv")
    
            if "1" in hint:
                if self.current_module1:
                    self.current_module1 = importlib.reload(self.current_module1)
                else:
                    self.current_module1 = importlib.import_module("Mod1")
                self.module = self.current_module1.Module()
            if "2" in hint:
                if self.current_module2:
                    self.current_module2 = importlib.reload(self.current_module2)
                else:
                    self.current_module2 = importlib.import_module("Mod2")
                self.module = self.current_module2.Module()
    
            self.ids.dock.add_widget(self.module)
    
    • 2

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve