Saya menggunakan kivy untuk membuat Aplikasi kecil untuk pembelajaran dengan bantuan komputer.

Saat ini saya memiliki beberapa masalah dengan mengakses nilai konfigurasi. Saya mendapatkan nilainya dengan

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

Di App-Class utama. Itu berfungsi dengan baik, namun, saya tidak tahu cara mengakses nilai ini di dalam widget lain - dalam hal ini AudioButton.

Saya menggunakan ScreenManager, yang berisi Screen. Di dalamnya ada BoxLayout, yang berisi GridLayout dan ini menampung beberapa AudioButtons.

Sekarang, di AudioButton ini saya ingin mengetahui nilai self.language saat ini yang didefinisikan di mainApp.

Dalam file .kv saya dapat melakukan sesuatu seperti

`text: app.language`

Untuk mendapatkannya, tetapi bagaimana melakukannya secara langsung dengan Python?

Jika saya menggunakan label dummy di kv untuk mendapatkan nilainya, itu berfungsi, tetapi ketika saya mengubah pengaturan, saya perlu memulai ulang Aplikasi, karena saya tidak tahu apa yang perlu saya tambahkan ke on_config_change() untuk memperbarui nilai selama runtime.

Ini adalah versi Aplikasi saya yang sangat disederhanakan dengan semua bagian yang menarik, saya harap.

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()

Dan file .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: ""
7
R. Gsell 13 Agustus 2017, 21:59

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan metode berikut dari kelas aplikasi get_running_app(), lihat di sini https://kivy.org/docs/api-kivy.app.html#kivy.app.App.get_running_app

Dengan cara ini Anda dapat mereferensikan konfigurasi dari kelas lain melalui kelas aplikasi.

Saya menulis contoh cepat di bawah ini. Saya menggunakan self.text = App.get_running_app().config.get('Label','content') untuk mengakses sth di konfigurasi.

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()
5
PalimPalim 14 Agustus 2017, 07:28

Alternatif untuk App.get_running_app().config adalah menggunakan ConfigParser.get_configparser('app').

Ini memberi Anda objek konfigurasi Anda secara langsung.

Metode bahkan lebih baik, jika Anda ingin mengikat nilai atau melakukan lebih dari sekadar mencarinya sekali, adalah dengan menggunakan ConfigParserProperty.

Ini memungkinkan Anda menggunakan nilai dari konfigurasi Anda secara langsung sebagai properti tanpa harus berurusan dengan konfigurasi sendiri atau memantau perubahan konfigurasi:

class LunahutsoApp(App):
    language = ConfigParserProperty('austrian', 
                    'basicsettings', 'language', 'app')
    playsound = ConfigParserProperty(1, 
                    'basicsettings', 'playsound', 'app')

    ...

Kemudian Anda dapat mengikat nilai dalam Kv (CATATAN: cara Anda mendefinisikan langauge dan playsound, label Kv Anda tidak akan diperbarui secara otomatis, karena bukan Properti):

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

Anda juga dapat menentukan ConfigParserProperty di Layar atau Widget apa pun (bukan hanya Aplikasi):

class AudioButton(Button):
    filename = StringProperty(None)
    sound = ObjectProperty(None, allownone=True)
    playsound = ConfigParserProperty('1', 
                    'basicsettings', 'playsound', 'app')


<AudioButton>:
    Label:
        id: language
        text: app.language
        color: 0, 0, 0, 0
    Label:
        text: self.playsound
        color: 0, 0, 0, 0
        on_press: if self.playsound == '1': self.sound.play()
3
bj0 31 Maret 2018, 05:10