Как правильно вызвать функцию, когда я вызываю ее из приложения? - PullRequest
1 голос
/ 07 апреля 2019

У меня есть функция, которая отображает сохраненные слова на экране с именем block_screen. Если я назову его в моем .kv файле, нажав кнопку на BlockScreen, как root.d_sl(), то он будет работать хорошо. Но я хочу, чтобы это отображалось при открытии этого экрана, а не когда я нажимаю кнопку на этом экране, чтобы сделать это. Поэтому я называю этот BlockScreen как «b» в приложении и использую его в моем home_screen как app.b.d_sl(), и он делает только часть печати и не отображает слова.

код

.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

Как мне решить эту проблему?

1 Ответ

1 голос
/ 07 апреля 2019

Строка b = BlockScreen() в вашем App создает новый BlockScreen, на который вы ссылаетесь app.b, но BlockScreen не отображается вашим приложением.Отображаемое BlockScreen создается вашим основным файлом kv.Для доступа к отображаемому BlockScreen, я думаю, вам нужно что-то вроде app.root.ids.block_screen.d_sl().И убери строку b = BlockScreen().

...