python - Kivy:从任何小部件访问配置值

标签 python kivy

我正在使用 kivy 创建一个用于计算机辅助学习的小应用程序。

目前我在访问配置值时遇到了一些问题。 我得到了值(value)

self.language = self.config.get('basicsettings', 'language')

在主应用程序类中。这很好用,但是,我不知道如何在另一个小部件中访问这些值 - 在本例中是 AudioButton。

我正在使用一个包含屏幕的屏幕管理器。里面是一个 BoxLayout,它包含一个 GridLayout 和几个 AudioButton。

现在,在这个 AudioButton 中,我想知道在 mainApp 中定义的 self.language 的当前值。

在 .kv 文件中我可以做类似的事情

`text: app.language`

得到它,但如何直接在 Python 中完成?

如果我在 kv 中使用虚拟标签来获取值,它可以工作,但是当我更改设置时,我需要重新启动应用程序,因为我不知道我需要添加什么到 on_config_change( ) 在运行时更新值。

我希望这是我的应用程序的一个非常简化的版本,其中包含所有有趣的部分。

class AudioButton(Button):
    filename = StringProperty(None)
    sound = ObjectProperty(None, allownone=True)

    def on_press(self):
        if self.ids.playsound.text == '1':
            self.sound.play()
        else:
            print('NoSound')


class MainScreen(Screen):
    pass


class Pictures1(GridLayout):
    def __init__(self, **kwargs):
        super(Pictures1, self).__init__(**kwargs)
        self.cols = 2
        btn = AudioButton()
        self.add_widget(btn)
        btn = AudioButton()
        self.add_widget(btn)


class Lesson1(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class LunahutsoApp(App):
    def build(self):
        self.settings_cls = SettingsWithSidebar
        self.use_kivy_settings = False
        self.language = self.config.get('basicsettings', 'language')
        self.playsound = self.config.get('basicsettings', 'playsound')
        return ScreenManagement()

    def build_config(self, config):
        config.setdefaults('basicsettings', {
            'language': 'austrian',
            'playsound': 1})

    def build_settings(self, settings):
        settings.add_json_panel('Lunahutso',
                                self.config,
                                data=settings_json)

    def on_config_change(self, config, section,
                         key, value):
        if key == 'language':
            self.language = value
        if key == 'playsound':
            self.playsound = value


if __name__ == "__main__":
    LunahutsoApp().run()

和 .kv 文件:

<ScreenManagement>:
    MainScreen:
    Lesson1:

<AudioButton>:
    Label:
        id: language
        text: app.language
        color: 0, 0, 0, 0
    Label:
        id: playsound
        text: app.playsound
        color: 0, 0, 0, 0

<MainScreen>:
    name: "main"
    BoxLayout:
        orientation: 'vertical'
        Button:
            on_release: app.root.current = "lesson1"
            text: "Lesson"
            font_size: 50
        Button:
            on_release: app.open_settings()
            text: "Settings"
            font_size: 50
        Button:
            on_release: sys.exit()
            text: "Quit"
            font_size: 50

<Lesson1>:
    name: "lesson1"
    id: lesson1
    BoxLayout:
        orientation: 'vertical'
        Pictures1:
            size_hint_y: 0.5
        BoxLayout:
            size_hint_y: 0.15
            Label:
                text: ""

最佳答案

您可以使用应用类 get_running_app() 的以下方法,参见此处 https://kivy.org/docs/api-kivy.app.html#kivy.app.App.get_running_app

这样你就可以通过应用类引用另一个类的配置。

我在下面写了一个简单的例子。我正在使用 self.text = App.get_running_app().config.get('Label','content') 访问配置中的某物。

from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.config import Config


class Labelwithconfig(Label):

    def check_label(self):
        self.text = App.get_running_app().config.get('Label','content')

kv_str = Builder.load_string("""
BoxLayout:
    orientation: 'vertical'
    Labelwithconfig:
        id: labelconf
    Button:
        text: 'open settings'
        on_press: app.open_settings()
""")



class MyApp(App):
    def build_config(self, config):
        config.setdefaults('Label', {'Content': "Default label text"})

    def build_settings(self, settings):
        settings.add_json_panel("StackOverflow Test Settings", self.config, data="""
        [
        {"type": "options",
        "title": "Label text System",
        "section": "Label",
        "key": "Content",
        "options": ["Default label text", "Other Label text"]
        }
        ]"""
        )
    def on_config_change(self, config, section, key, value):
        self.root.ids.labelconf.check_label()

    def build(self):
        return kv_str


if __name__ == '__main__':
    MyApp().run()

关于python - Kivy:从任何小部件访问配置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663871/

相关文章:

python - 这条线在错误的地方 split

python - 为什么 wxPython 面板会屏蔽按键事件?

python - cv2编辑的图像以错误的颜色保存

python - Kivy - 如何从带/不带修饰符的按键中获取正确的字符?

python-2.7 - Kivy 色轮

python - 光谱聚类、图像分割和特征向量

python - 为什么 “np.inf//2” 导致 NaN 而不是无穷大?

python - 如何在 kivy 中将 pos_hint 与 FloatLayout 一起使用?

python - 基维 : how to get widget by id (without kv)

python - Kivy 中的 Askopenfilename 替代方案