Смена виджета с другого экрана в Киви - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь обновить один виджет через кнопку в другом представлении в Kivy.

Код Kivy:

<MainScreen>:
    relatorios : relatorios
    despesas : despesas
    GridLayout:
        size: root.width, root.height
        cols : 1
        Button:
            id: relatorios
            text: 'Relatorios'
            on_press: root.change_screen(rep = 'Report')
        Button:
            id: despesas
            text:  'Despesa'
            on_press: root.change_screen(rep = 'Expend')

<ReportScreen>:
    GridLayout:
        size: root.width, root.height
        cols : 1
        Button:
            id: semanal
            text: 'Semanal'
        Button:
            id: mensal
            text:  'Mensal'
        Button:
            id: anual
            text:  'Anual'
        Button:
            id: voltar
            text:  'Voltar'
            on_press: root.change_screen(rep = 'Main')

<ExpendScreen>:
    kind_selec1 : kind_select
    GridLayout:
        size: root.width, root.height
        cols : 2
        Label:
            id: kind
            text: 'Tipo de Despesa'
        Button:
            id: kind_select
            text:  'Selecionar'
            on_press: root.change_screen(rep = 'Kind')
        Label:
            id: way
            text:  'Meio de Pagamento'
        Button:
            id: selec_way
            text:  'Selecionar'
            on_press: root.change_screen(rep = 'Way')
        Label:
            id: parcelas
            text:  'Quantidade de Parcelas'
        TextInput:
            id: qtdy
        Label:
            id: value
            text:  'Valor Total'
        TextInput:
            id: qtdy
        Button:
            id: back
            text:  'Voltar'
            on_press: root.change_screen(rep = 'Main')
        Button:
            id: submit
            text:  'Registrar'
            on_press: root.change_name()

<DropDown1>:
    cols : 1
    orientation: 'vertical'

<DropDown2>:
    cols : 1
    orientation: 'vertical'

Python код:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from functools import partial
from functions import Expense
from kivy.properties import ObjectProperty
import kivy
import time

class MainScreen(Widget):
    relatorios = ObjectProperty(None)
    despesas = ObjectProperty(None)

    def change_screen(self,rep):
        app_finan_con.screen_manager.current = rep
        return


class ReportScreen(Widget):
    def change_screen(self,rep):
        app_finan_con.screen_manager.current = rep
        return

class ExpendScreen(Widget):
    kind_selec1 = ObjectProperty()

    def __init__(self, **kwargs):
        super(ExpendScreen, self).__init__(**kwargs)
    def change_screen(self,rep):
        app_finan_con.screen_manager.current = rep
    def change_name(self):
        self.kind_selec1.text= 'porra'


class Dropdown1(BoxLayout):
    def __init__(self, **kwargs):
        super(Dropdown1, self).__init__(**kwargs)
        list = ['Alimentação', 'Transporte', 'Entretenimento','Moradia','Doação']
        for item in list:
            self.but = Button(text=item)
            self.add_widget(self.but)
            self.but.bind(on_release=partial(self.It,arg = item))

    def It(self,instance,arg):
        app_finan_con.screen_manager.current = 'Expend'
        ExpendScreen.change_name(ExpendScreen)


class Dropdown2(BoxLayout):
    def __init__(self, **kwargs):
        super(Dropdown2, self).__init__(**kwargs)
        list = ['Crédito', 'Débito', 'Dinheiro']
        for item in list:
            self.but = Button(text=item)
            self.add_widget(self.but)
            self.but.bind(on_release=partial(self.It, arg=item))

    def It(self,instance,arg):
        app_finan_con.screen_manager.current = 'Expend'



class MyApp(App):

    def build(self):
        self.screen_manager = ScreenManager()

        self.mainscreen = MainScreen()
        screen = Screen(name='Main')
        screen.add_widget(self.mainscreen)
        self.screen_manager.add_widget(screen)

        self.reportscreen = ReportScreen()
        screen = Screen(name='Report')
        screen.add_widget(self.reportscreen)
        self.screen_manager.add_widget(screen)

        self.expendscreen = ExpendScreen()
        screen = Screen(name='Expend')
        screen.add_widget(self.expendscreen)
        self.screen_manager.add_widget(screen)

        self.dropdown1 = Dropdown1()
        screen = Screen(name='Kind')
        screen.add_widget(self.dropdown1)
        self.screen_manager.add_widget(screen)

        self.dropdown2 = Dropdown2()
        screen = Screen(name='Way')
        screen.add_widget(self.dropdown2)
        self.screen_manager.add_widget(screen)

        return self.screen_manager

def change_screen():
    app_finan_con.screen_manager.current ='Report'
    return


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

Идея состоит в том, чтобы использовать экран Dropdown1 для изменения экрана ExpendScreen с помощью этого кода:

class Dropdown1(BoxLayout):
    def __init__(self, **kwargs):
        super(Dropdown1, self).__init__(**kwargs)
        list = ['Alimentação', 'Transporte', 'Entretenimento','Moradia','Doação']
        for item in list:
            self.but = Button(text=item)
            self.add_widget(self.but)
            self.but.bind(on_release=partial(self.It,arg = item)) (this line activates It method)

    def It(self,instance,arg):  
        app_finan_con.screen_manager.current = 'Expend'
        ExpendScreen.change_name(ExpendScreen) (this line activates method in ExpendScreen):

class ExpendScreen(Widget):
    kind_selec1 = ObjectProperty()

    def __init__(self, **kwargs):
        super(ExpendScreen, self).__init__(**kwargs)
    def change_screen(self,rep):
        app_finan_con.screen_manager.current = rep
    def change_name(self):
        self.kind_selec1.text= 'porra'

, но я получаю следующую ошибку: AttributeError: 'kivy.properties.ObjectProperty' object не имеет атрибута 'text'

но когда я вызываю тот же метод с кнопки на том же экране (ExpendScreen), он работает, как и ожидалось, код kivy:

Button:
   id: submit
   text:  'Registrar'
   on_press: root.change_name()

Примеры изображений: Expend screen, when I press the first 'selecionar' button, the screen is chaged to the DropDown1 screen

DropDown1, when I press any of this buttons I should switch to the previous view and it should be updated, like picture 3:

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 29 апреля 2020

Ваша строка кода:

ExpendScreen.change_name(ExpendScreen) 

вызывает метод экземпляра ExpendScreen без экземпляра. Это не сработает. Вам нужно получить экземпляр ExpendScreen, который является частью вашего gui, и вызвать его change_name метод. Я не проверял это, но я думаю, что замена вышеуказанной строки на:

app_finan_con.expendscreen.change_name()

будет делать то, что вы хотите.

...