Use of Class in Kivy

Asked

Viewed 204 times

0

Good afternoon, I want to make a program that uses several combobox and in one window. But I can’t get both. When I run the program, only one of the combobox appears. Below I send the current code.

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.dropdown import DropDown
from kivy.properties import ListProperty
from kivy.core.window import Window

class ComboPotenciaConsumo(BoxLayout):
    textoEntradaPotenciaConsumo = StringProperty()
    opcoesPotenciaConsumo = ListProperty()
    valorInicialPotenciaConsumo = StringProperty()

    def __init__(self, **kwargs):
        super(ComboPotenciaConsumo, self).__init__(**kwargs)
        self.opcoesPotenciaConsumo = ['Potência', 'Consumo']
        self.valorInicialPotenciaConsumo = 'Potência'

    def print_txt1(self):
        if self.textoEntradaPotenciaConsumo == 'Potência':
            a = 1
        elif self.textoEntradaPotenciaConsumo == 'Consumo':
            a = 2

        print('{}'.format(a))

class ComboPotenciaPainel(BoxLayout):
        textoEntradaPotenciaPainel = StringProperty()
        opcoesPotenciaPainel = ListProperty()
        valorInicialPotenciaPainel = StringProperty()
    def __init__(self, **kwargs):
        super(ComboPotenciaPainel, self).__init__(**kwargs)
        self.opcoesPotenciaPainel =['275 Wp', '330 Wp', '360 Wp']

    def print_txt2(self):
        if self.textoEntradaPotenciaPainel == '275 Wp':
            potenciaPainel = 275
        elif self.textoEntradaPotenciaPainel == '330 Wp':
            potenciaPainel = 330
        elif self.textoEntradaPotenciaPainel == '360 Wp':
            potenciaPainel = 360

        print('{}'.format(potenciaPainel))

class ProgramaOrcamentoKivy(App):
    def build(self):
        return ComboPotenciaConsumo()
        return ComboPotenciaPainel()

if __name__ == '__main__':
    Window.size = (1000, 300)
    ProgramaOrcamentoKivy().run()

Below I also upload the Kv file

<ComboPotenciaConsumo>:
    opcoesPotenciaConsumo: spinner_1.values
    valorInicialPotenciaConsumo: spinner_1.text

orientation: 'vertical'

Label:
    text: 'Orcamentos 1.1'
    font_size: '40sp'
    bold: True
    color: [1, 0, 0, 1]
    height: '32dp'

GridLayout:
    cols: 2
    spacing: 20
    padding: [20,20]

    Button:
        on_press: root.print_txt1()
        text: 'Button 1'
        id: but_1
        size_hint: [1, None]
        height: '32dp'

    Spinner:
        id: spinner_1
        values: root.opcoesPotenciaConsumo
        size_hint: [0.5, None]
        height: '32dp'
        on_text: root.textoEntradaPotenciaConsumo = self.text

:

opcoesPotenciaConsumo: spinner_2.values
valorInicialPotenciaConsumo: spinner_2.text

orientation: 'vertical'

Label:
    text: 'Orcamentos 1.1'
    font_size: '40sp'
    bold: True
    color: [1, 0, 0, 1]
    height: '32dp'

GridLayout:
    cols: 2
    spacing: 20
    padding: [20,20]

    Button:
        on_press: root.print_txt2()
        text: 'Button 2'
        id: but_2
        height: '32dp'

    Spinner:
        id: spinner_2
        values: root.opcoesPotenciaPainel
        size_hint: [8, None]
        height: '32dp'
        on_text: root.textoEntradaPotenciaPainel = self.text
  • Format your code correctly...

1 answer

0

That its function

def build(self):
    return ComboPotenciaConsumo()
    return ComboPotenciaPainel()

Has two return - but when python finds return it closes the function, therefore, the second return will never be executed!

Therefore, the second combo is not being created because of this.

There are several ways to solve depending on how you want to format your application. One of them is to create a layout and put the two combos in the layout, then use a return only:

def build(self):
    c1 = ComboPotenciaConsumo()
    c2 = ComboPotenciaPainel()
    l = BoxLayout(padding=5)
    l.add_widget(c1)
    l.add_widget(c2)
    return l

Browser other questions tagged

You are not signed in. Login or sign up in order to post.