Search code examples
pythonclassoopkivykivy-language

How to call a function correctly when I call her from app?


I have a function that display saved words on screen named block_screen. If I call it in my .kv file by clicking button in BlockScreen like root.d_sl(), then it works good. But, I want this to display when I open this screen, not when I press the button on this screen to do it. So I call this BlockScreen like 'b' in App and use it in my home_screen like app.b.d_sl(), and it make only print part and not displaying words.

Code

.py file:
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
import slovar

class HomeScreen(Screen):
    pass

...screens....

class OpenScreen(Screen):
    def ob_slova(self):
        self.ids.text_label.text = slovar.slova_obichnie()
        f = open('nicknames.txt', 'a')
        f.write(self.ids.text_label.text + '\n')
        f.close()

class BlockScreen(Screen):
    def d_sl(self):
        self.ids.label_text.text = "ppp"
        f1 = open('nicknames.txt', 'r')
        for i in f1:
            self.ids.label_text.text += i
        f1.close()
        if self.ids.label_text.text == "":
            print('p')
        else:
            print(self.ids.label_text.text)


GUI = Builder.load_file('game.kv')
class GameApp(App):
    b = BlockScreen()
    def build(self):
        return GUI

    def change_screen(self, screen_name):
        screen_manager = self.root.ids['screen_manager']                
        screen_manager.current = screen_name

GameApp().run()


homescreen.kv file:
#:kivy 1.10.1
<HomeScreen>:
    Button:
         size_hint: .7, .1
         pos_hint:{"x":.15, "y":.47}
         background_normal: 'kn1.png'
         text: "HISTORY"
         font_size: self.height - 20
         valign: 'middle'
         halign: 'center'
         padding_x: 56,56
         on_release:
             app.change_screen('block_screen')
             app.b.d_sl()



blockscreen.kv file:
#:kivy 1.10.1
<BlockScreen>:
    Button:
        text: "Z"
        font_size: self.height - 24
        valign: 'center'
        halign: 'center'
        padding: 2,2
        size_hint: .5, .08
        pos_hint: {'x':.5, 'y':.0}
        background_normal: 'kn2.png'
        on_release:
            root.d_sl()
main kv file:
#:kivy 1.10.1
#:include homescreen.kv
#:include openscreen.kv
#:include blockscreen.kv
#:include engscreen.kv

GridLayout:
    cols: 1
    ScreenManager:
        id: screen_manager
        HomeScreen:
            name: "home_screen"
            id: home_screen
        OpenScreen:
            name: "open_screen"
            id: open_screen
        BlockScreen:
            name: "block_screen"
            id: block_screen
        EngScreen:
            name: "eng_screen"
            id: eng_screen

How do I solve this problem?


Solution

  • The line b = BlockScreen() in your App creates a new BlockScreen that you reference with app.b, but that BlockScreen is not displayed by your app. The BlockScreen that is displayed is created by your main kv file. To access the displayed BlockScreen, I think you need something like app.root.ids.block_screen.d_sl(). And remove the line b = BlockScreen().