Drop-Down List

0

Dobry wieczór,

Byłbym bardzo wdzięczny za pomoc. Próbuję zrobić Drop-Down List w kivy. Po pierwsze kod nie działa. Po drugie chciałbym wybór użytkownika zapisać jako input, spiklować i wykorzystać później w funkcji. Poniżej załączam tylko fragment kodu, który dotyczy problemu.


Builder.load_string('''

<DetailsLayout>

    canvas.before:
        BorderImage:
            # BorderImage behaves like the CSS BorderImage
            border: 10, 10, 10, 10
            texture: self.background_image.texture
            pos: self.pos
            size: self.size
            
<SexDropDown>:
    Button:
        text: 'Male'
        size_hint_y: None
        height: 44
        on_release: root.select('Male')

    Button:
        text: 'Female'
        size_hint_y: None
        height: 44
        on_release: root.select('Female')
                   
<DetailsScreen>:
    DetailsLayout:
        size_hint: .99, .99
        pos_hint: {'center_x': .5, 'center_y': .5}
    Button:
        pos_hint: {'x': .01, 'y': .90}
        size_hint: .50, .10
        background_color:0, 0, 0, 0
        on_press: 
            root.manager.current = "Main"
            root.manager.transition.direction = 'left'
    SexDropDown:
        pos_hint: .5, .7

''')


class DetailsLayout(FloatLayout):

    background_image = ObjectProperty(
        Image(
            source='Details.png'))


class DetailsScreen(Screen):
   pass


class SexDropDown(DropDown):
    pass

dropdown = SexDropDown()
mainbutton = Button(text='Select', size_hint=(None, None))
mainbutton.bind(on_release=dropdown.open)
dropdown.bind(on_select=lambda instance, x: setattr(mainbutton, 'text', x)) 

Błąd, który dostaje to: AttributeError: 'tuple' object has no attribute 'items'
Nie bardzo rozumiem też co się znajduje w ostatniej linijce - skopiowałem są ze strony kivy, wydaje mi się, że gdzieś tutaj powinien być ten input, tylko jak? Bardzo proszę o jakiś link gdzie podobny problem byłby rozwiązany.

Zanim zacząłem kivy kod wyglądał tak:

    details = {}
    details["activity"] = float(input("activity:"))
    details["sex"] = str(input("sex:"))
    details["weight"] = float(input("weight:"))
    details["goal"] = str(input("goal:"))

Teraz muszę zrobić 4 listy i zapisać wyniki do jednego słownika "details"

0

Udało mi się zrobić spinner, który przynajmniej częściowo działa jak należy.


from kivy.app import App
import pickle
import os.path
from kivy.uix.image import Image
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string('''

<DetailsLayout>
    canvas.before:
        BorderImage:
        border: 10, 10, 10, 10
        texture: self.background_image.texture
        pos: self.pos
        size: self.size


<DetailsScreen>:
    DetailsLayout:
        size_hint: .99, .99
        pos_hint: {'center_x': .5, 'center_y': .5}
    Button:
        pos_hint: {'x': .01, 'y': .90}
        size_hint: .50, .10
        background_color:0, 0, 0, 0
        on_press: 
            root.manager.current = "Main"
            root.manager.transition.direction = 'left'


    Spinner:
        id: spinner_1
        pos_hint: {'x': .35, 'y': .65}
        size_hint: .30, .05
        background_color:0, 0, 0, 0
        text: '< Select >'
        values: root.pickType
        on_text: root.updateSexSpinner(spinner_1.text)
''')

class DetailsLayout(FloatLayout):

    background_image = ObjectProperty(
        Image(
            source='Details.png'))

class DetailsScreen(Screen):

    def details_check(self):
        if not os.path.isfile("details.pickle"):
             details = {}
             with open("details.pickle", "wb") as f:
                 pickle.dump(details, f, pickle.HIGHEST_PROTOCOL)
        else:
             pass

    def addChoice(key, value):

        with open("details.pickle", "rb") as f:
            details = pickle.load(f)

        details[key] = value

        with open("details.pickle", "wb") as f:
            pickle.dump(details, f, pickle.HIGHEST_PROTOCOL)

    def __init__(self, **kwargs):
        self.sex_chioce()
        super(DetailsScreen, self).__init__(**kwargs)

    def sex_chioce(self):
        self.pickType = ['Select','Male','Female']
        self.pickSubType = ['Select']

    def updateSexSpinner(self,text):
        if text == 'Male':
            self.pickSubType.extend('A'+'B')
        elif text == 'Female':
            self.pickSubType.extend('P'+'Q')
        else:
            self.pickSubType.extend('Y'+'Z')

sm = ScreenManager()
sm.add_widget(MainScreen(name='Main'))
sm.add_widget(DetailsScreen(name='Details'))

class App(App):

    def build(self):
        return sm

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

Tylko teraz nie wiem jak zmienić kolor buttonów, które się rozwijają - zmieniłem tylko główny na przezroczysty i nie bardzo wiem jak dodać jeszcze jeden spinner na tym samym ekranie. Kiedy dubluje spinner to i tak pojawia się jeden. Zapisywanie do słownika też nie działa ;) Jeśli ktoś w czymś może pomóc, proszę się nie krępować. Jak coś sam wymyślę, od razu wrzucę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1