在Kivy屏幕之间传递文本输入

时间:2019-11-27 16:41:05

标签: python kivy

我在从一个屏幕获取文本输入值并将其作为文本传递到另一屏幕的标签时遇到麻烦。我想从 TeamNameSelect 屏幕中输入文本,并将其作为 GameWindow 屏幕标签中的文本值。我在这里尝试过类似的问题和答案,但无法使其正常工作。任何帮助将不胜感激!

.py文件

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.widget import Widget

class NewGame(Screen):
    pass

class GameWindow(Screen):
    def teamNames(self, *args):
        self.teamOne_input.text = self.manager.ids.TeamNameSelect.ids.teamOne.text
        self.teamTwo_input.text = self.manager.ids.TeamNameSelect.ids.teamTwo.text
    pass

class TeamNameSelect(Screen):
    pass


class WinMan(ScreenManager):
    pass

kv = Builder.load_file("my.kv")
sm = WinMan()

screens = [NewGame(name='goBack'), TeamNameSelect(name='teamSelect'), GameWindow(name='startGame')]

for screen in screens:
    sm.add_widget(screen)

sm.current = 'goBack'

class MyApp(App):

    def build(self):
        return sm

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

.kv文件

<TeamNameSelect>:

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            padding: 10
            Label:
                text: 'Team 1 Name: '
            TextInput:
                id: teamOne
                text: ''
                multiline: False
        BoxLayout:
            orientation: 'vertical'
            padding: 10
            Label:
                text: 'Team 2 Name: '
            TextInput:
                id: teamTwo
                text: ''
                multiline: False

        BoxLayout:
            Button:
                text: 'Go  Back'
                on_release: root.manager.current = 'goBack'
            Button:
                text: 'Game On!'
                on_release:
                    root.manager.current = 'gameWindow'
                    root.teamNames()

<GameWindow>:
    teamOne_input: teamOne_input
    teamTwo_input: teamTwo_input

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'horizontal'
            size_hint: (1, 0.1)
            Button:
                text: '. . .'
                on_release: root.manager.current = 'goBack'
            Label:
                font_size: 33
                text: 'Team'

            Label:
                font_size: 33
                id: teamOne_input
                text: ''
            Label:
                font_size: 33
                text: 'Team'
            Label:
                font_size: 33
                id: teamTwo_input
                text: ''

        BoxLayout:
            orientation: 'horizontal'
            size_hint: (0.75,1)
            Label:
                font_size: 33
                text: '' # Instructions on how to play game
            Label:
                font_size: 39
                text: '' # Future playing area to develop

1 个答案:

答案 0 :(得分:0)

您有2个主要错误:

  • 没有名称为“ gameWindow”的屏幕,因此我想OP希望编写“ startGame”。

  • on_release中的根是“ TeamNameSelect”,显然没有不具有teamNames()方法的内容。

另一方面,“。manager”未在.kv中实现,因此它不能具有任何“ id”,解决方案是使用get_screen()方法访问名称为“ teamSelect”的屏幕。

考虑到上述情况,解决方案是:

class GameWindow(Screen):
    def teamNames(self):
        select_screen = self.manager.get_screen("teamSelect")
        self.teamOne_input.text = select_screen.ids.teamOne.text
        self.teamTwo_input.text = select_screen.ids.teamTwo.text
Button:
    text: 'Game On!'
    on_release:
        root.manager.current = 'startGame'
        root.manager.current_screen.teamNames()