How to call a top class method from the bottom? For example, inside the main class there is a class based on a modal window. In this modal window, I enter the name of the file being created and click on "OK", the file is created and the task in the main class is to update the list of files (run the update method of the main class)

from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.modalview import ModalView from kivy.lang.builder import Builder Builder.load_string(''' <SomeScreen1>: Button: text:'Please, push me!' on_release:root.view() <Win>: auto_dismiss:False size_hint:(.8,.8) BoxLayout: orientation:'vertical' Label: text:'some text' Button: text:'leave win!' on_release:root.leave() ''') class SomeScreen1(Screen): def __init__(self,**kwargs): super().__init__(**kwargs) self.win=Win() def view(self): self.win.open() def print_func1(self): print('OK1!') class Win(ModalView): def __init__(self,**kwargs): super().__init__(**kwargs) def leave(self): self.dismiss() #Вызвать print_func с этого места #Вызвать print_func1 тоже с этого места class TestApp(App): def build(self): sm=ScreenManager() sm.add_widget(SomeScreen1(name='screen one')) return sm def print_func(self): print('OK!') TestApp().run() 
  • Show the code in which you call the modal dialogue in the main class - gil9red
  • Something like that. There was an attempt to make TestApp.print_func (self) in the leave function, but how correct is it? I dont know. - Alexey Osinny
  • one
    Add the some_screen1 parameter to the Win some_screen1 , and initiate the field: self.some_screen1 = some_screen1 . In the constructor SomeScreen1 change the string self.win=Win() -> self.win = Win(self) . In leave use that link to another window: self.some_screen1.print_func1() - gil9red 5:24 pm

1 answer 1

Works)

 from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.modalview import ModalView from kivy.lang.builder import Builder Builder.load_string(''' <SomeScreen1>: Button: text:'Please, push me!' on_release:root.view() <Win>: auto_dismiss:False size_hint:(.8,.8) BoxLayout: orientation:'vertical' Label: text:'some text' Button: text:'leave win!' on_release:root.leave() ''') class SomeScreen1(Screen): def __init__(self,main_screen,**kwargs): super().__init__(**kwargs) self.main_screen=main_screen #Создаём и передаём и себя и TestApp self.win=Win(self,self.main_screen) self.my_name='second' def view(self): self.win.open() def print_func1(self): print(self.my_name) class Win(ModalView): def __init__(self,some_screen1,main_screen,**kwargs): super().__init__(**kwargs) self.main_screen=main_screen self.some_screen1=some_screen1 def leave(self): self.dismiss() #вызываем метод класса SomeScreen1 self.some_screen1.print_func1() #вызывем метод класса TestApp self.main_screen.print_func() class TestApp(App): def build(self): sm=ScreenManager() #Создаём и передаём себя sm.add_widget(SomeScreen1(self,name='screen one')) self.my_name='main' return sm def print_func(self): print(self.my_name) TestApp().run()