简体   繁体   中英

Changing widget from another screen in Kivy

I'm trying to update one widget in through a button in another view at Kivy.

Kivy code:

<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 code:

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

The idea is to use screen Dropdown1 to modify screen ExpendScreen through this code:

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'

but I get the following error: AttributeError: 'kivy.properties.ObjectProperty' object has no attribute 'text'

but when I call the same method from a button in the same screen (ExpendScreen) it works as expected, kivy code:

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

Image examples: 扩展屏幕,当我按下第一个“选择”按钮时,屏幕切换到 DropDown1 屏幕

DropDown1,当我按下任何这个按钮时,我应该切换到上一个视图并且它应该被更新,如图 3 所示:

Can anyone help me?

Your line of code:

ExpendScreen.change_name(ExpendScreen) 

is calling an instance method of ExpendScreen without an instance. That won't work. You need to get the instance of ExpendScreen that is part of your gui, and call its change_name method. I haven't tested this, but I think replacing the above line with:

app_finan_con.expendscreen.change_name()

will do what you want.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM