Kivy - CustomDropdown - ScreenManager - сбой - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь добавить CustomDropDown к кнопке, но почему-то кажется, что виджет CustomDropDown запускается дважды (список дублирования), и когда я нажимаю на имя, я получаю следующий ответ:

Ошибка:

File "C:\Continuum\anaconda3\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback 
exec(__kvlang__.co_value, idmap)
   File "C:\Temp\privat\zucchini\my.kv", line 6, in <module>
     app.root.ids.btn.text = '{}'.format(args[1])
   File "kivy\properties.pyx", line 863, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

введите описание изображения здесь

Так что да, я не понимаю, что делаю не так ... И мысли приветствуются! :)

КОД:

from kivy.uix.screenmanager import ScreenManager, Screen

from kivy.lang import Builder
from kivy.properties import ObjectProperty

class WindowManager(ScreenManager):
    pass

class MainWindow(Screen):
    dropdown = ObjectProperty(None)

    def __init__(self, **kw):
        super().__init__(**kw)
        self.cols = 1

class SecondWindow(Screen):
    pass

class MyApp(App):
    """
    """
    def build(self):
        return Builder.load_file("my.kv")

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

При виде kv-файла:

#:import Factory kivy.factory.Factory

<CustomDropDown@DropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
        self.dismiss()

    Button:
        id: btn1
        text: 'name1'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.select(btn1.text)

    Button:
        id: btn2
        text: 'name2'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.select(btn2.text)

    Button:
        id: btn3
        text: 'name3'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.select(btn3.text)

WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"

    GridLayout:
        cols: 1

        GridLayout:
            cols: 1
        GridLayout:
            cols: 1

        GridLayout:
            cols: 2
            Button:
                id: btn
                text: 'Set name'
                on_release: Factory.CustomDropDown().open(self)
            Button:
                text: "Submit"
                on_release:
                    app.root.current = "second"
                    root.manager.transition.direction = "right"

<SecondWindow>:
    name: "second"
    Button:
        text: "Go Back"
        on_release:
            app.root.current = "main"
            root.manager.transition.direction = "left"

1 Ответ

0 голосов
/ 10 июля 2020

Во-первых, приятель, вы забыли добавить к из kivy.app import App в вашем .py файле. Этот код не дает мне дважды вашу кнопку. Он выглядит правильно и дал мне только 3 кнопки, когда вы wi sh. Я показал вам ниже, как вы можете вызвать, какая кнопка нажата. И я предлагаю вам легко создать эти 3 кнопки в файле .py с помощью al oop, потому что они выглядят одинаково. Надеюсь, эти коды помогут вы.

Это мой код:

My .py файл:

from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.dropdown import DropDown

class CustomDropDown(DropDown):
    def give_my_value(self,value):
        print('Selected value is :',value)
class WindowManager(ScreenManager):
    pass

class MainWindow(Screen):
    dropdown = ObjectProperty(None)

    def __init__(self, **kw):
        super().__init__(**kw)
        self.cols = 1

class SecondWindow(Screen):
    pass

class MyApp(App):
    """
    """
    def build(self):
        return Builder.load_file("my.kv")

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

my.kv файл:

#:import Factory kivy.factory.Factory
<CustomDropDown@DropDown>:
    id: dropdown
    on_select:
        self.dismiss()
    Button:
        id: btn1
        text: 'name1'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.give_my_value(self.text)
            dropdown.dismiss()
    Button:
        id: btn2
        text: 'name2'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.give_my_value(self.text)
            dropdown.dismiss()
    Button:
        id: btn3
        text: 'name3'
        size_hint_y: None
        height: '32dp'
        on_release:
            dropdown.give_my_value(self.text)
            dropdown.dismiss()
WindowManager:
    MainWindow:
    SecondWindow:
<MainWindow>:
    name: "main"
    GridLayout:
        cols: 1
        GridLayout:
            cols: 1
        GridLayout:
            cols: 1
        GridLayout:
            cols: 2
            Button:
                id: btn
                text: 'Set name'
                on_release: Factory.CustomDropDown().open(self)
            Button:
                text: "Submit"
                on_release:
                    app.root.current = "second"
                    root.manager.transition.direction = "right"

<SecondWindow>:
    name: "second"
    Button:
        text: "Go Back"
        on_release:
            app.root.current = "main"
            root.manager.transition.direction = "left"
...