【问题标题】:Kivy/Python How to pass an object into another class?Kivy/Python 如何将一个对象传递给另一个类?
【发布时间】:2020-05-11 22:06:49
【问题描述】:

我正在尝试使用 Kivy/KivMD 和 python3 为一个学校项目编写一个网球应用程序,但我遇到了一些我无法解决的问题。

(1) 在我的 main.py 文件中,使用 create_match 方法,我成功地创建了 2 个对象,当按下按钮时,我想将它们用于下一个屏幕。问题是我不知道如何将这 2 个实例/对象传递到我想要的 GameScreen 类中。为了让这件事发挥作用,我只是在 GameScreen 类中手动添加了 2 个其他玩家对象,但这不是我想要的。我该怎么做?

(2) 在 main.kv 文件中,我想修改另一个文件中的 InputScreen 类(input_screen.kv,就像我对 game_screen.kv 所做的那样)。我怎么能在不破坏一切的情况下做到这一点?因为 InputScreen 包含一个按钮(CreateButton),它依赖于 main.kv 文件中的 ScreenManager,所以我有点卡住了......

这是我的两个主要问题,我知道阅读起来有点长,但如果有人能向我解释如何解决这个问题,我将不胜感激。我没有向你展示 Player 类,因为它没有问题,它只是根据网球规则计算每个玩家的分数。

P.S 我知道我应该显示最少的代码,但是 GUI 很难...

ma​​in.py

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivymd.uix.button import MDRectangleFlatButton

from App.score import Player


class HomeScreen(Screen):
    pass


class InputScreen(Screen):
    pass


class CreateButton(MDRectangleFlatButton, Player):

    def create_match(self):
        player1 = Player(self.player1_name)
        player2 = Player(self.player2_name)


class GameScreen(Screen, Player):

    player1 = Player('Player1')  # I want that the name is given by the user
    player2 = Player('Player2')


class TennisApp(MDApp):

    def build(self):
        self.theme_cls.primary_palette = "Teal"
        return Builder.load_file("main.kv")


if __name__ == "__main__":
    TennisApp().run()

ma​​in.kv

#:include game_screen.kv

ScreenManager:
    id: manager

    HomeScreen:
        name: "home_screen"
        id: home_screen
        MDRectangleFlatButton:
            text: "Create a match"
            pos_hint: {'center_x': .5, 'center_y': .5}
            on_release: manager.current = "input_screen"

    InputScreen:
        name : "input_screen"
        id: input_screen
        MDBoxLayout:
            size_hint: .6, .6
            pos_hint: {'center_x': .5, 'center_y': .8}
            spacing: dp(20)
            orientation: 'vertical'
            MDTextField:
                id: entry1
                hint_text: "First player name"
                helper_text_mode: "on_focus"
            MDTextField:
                id: entry2
                hint_text: "Second player name"
                helper_text_mode: "on_focus"
        CreateButton:
            text: "Create a match"
            pos_hint: {'center_x': .5, 'center_y': .2}
            on_release: manager.current = "game_screen"
            on_release: self.create_match()
            player1_name: entry1.text
            player2_name: entry2.text

    GameScreen:

game_screen.kv



<GameScreen>:
    name: "game_screen"
    id: second_screen
    MDBoxLayout:
        orientation: 'vertical'
        pos_hint: {'top': 1}
        adaptive_height: True
        MDBoxLayout:
            orientation: 'horizontal'
            pos_hint: {'center_y': .9}
            adaptive_height: True
            md_bg_color: app.theme_cls.primary_color
            MDLabel:
                text: "Players"
                halign: 'center'
            MDLabel:
                text: "Points"
                halign: 'center'
            MDLabel:
                text: "Games"
                halign: 'center'
            MDLabel:
                text: "Sets"
                halign: 'center'

        MDBoxLayout:
            orientation: 'horizontal'
            pos_hint: {'center_y': .8}
            adaptive_height: True

            MDLabel:
                text: root.player1.get_name()
                halign: 'center'
            MDLabel:
                id: points_label1
                text: '0'
                halign: 'center'
            MDLabel:
                id: games_label1
                text: "0"
                halign: 'center'
            MDLabel:
                id: sets_label1
                text: "0"
                halign: 'center'
        MDBoxLayout:
            adaptive_height: True
            orientation: 'horizontal'
            pos_hint: {'center_y': .7}

            MDLabel:
                text: root.player2.get_name()
                halign: 'center'
            MDLabel:
                id: points_label2
                text: "0"
                halign: 'center'
            MDLabel:
                id: games_label2
                text: "0"
                halign: 'center'
            MDLabel:
                id: sets_label2
                text: "0"
                halign: 'center'

    MDRectangleFlatButton:  # I know this repetition is ugly, I will change it later
        text: "{} wins the point".format(root.player1.get_name())
        pos_hint: {'center_x': .3, 'center_y':.2}
        on_press: root.player1.points_win(root.player2)
        on_release: points_label1.text = root.player1.get_points_amount()
        on_release: points_label2.text = root.player2.get_points_amount()
        on_release: games_label2.text = root.player2.get_games_amount()
        on_release: games_label1.text = root.player1.get_games_amount()
        on_release: sets_label2.text = root.player2.get_sets_amount()
        on_release: sets_label1.text = root.player1.get_sets_amount()
    MDRectangleFlatButton:
        text: "{} wins the point".format(root.player2.get_name())
        pos_hint: {'center_x': .7, 'center_y':.2}
        on_press: root.player2.points_win(root.player1)
        on_release: points_label2.text = root.player2.get_points_amount()
        on_release: points_label1.text = root.player1.get_points_amount()
        on_release: games_label2.text = root.player2.get_games_amount()
        on_release: games_label1.text = root.player1.get_games_amount()
        on_release: sets_label2.text = root.player2.get_sets_amount()
        on_release: sets_label1.text = root.player1.get_sets_amount()

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    首先,您不需要将类传递给另一个类以便在那里使用它。类就像存储方法或属性等基本功能的蓝图。为了使结构充满生命,您必须创建一个类的实例,其中可以将变量传递给类以使其更加独特或满足您的需求。您正在做的是使 GameScreen 类继承 Player 类。这会将 Player 类的方法和属性添加到 Gamescreen 类中,这并不是必需的。这本身就是一个巨大的话题,那里有很多很好的解释,如果你想了解更多,那就开始搜索吧。

    回到您的问题。您想知道如何将内容传递到课程中。我会给你一个简短的例子,我基于一个 Player 类创建了两个玩家,并将它们传递给 Arena 类,这是比赛发生的屏幕。

    当你定义一个类时,你也可以定义一个 init 方法。此方法采用您在创建实例时传递给类的所有属性。在这种情况下,我将 player_list 传递给 arena 类,这是您想要做的。在您的班级中,您可以对传递的对象做一些事情。我决定将属性命名为 player,然后将它们添加到 Playground。我希望它对您的项目有所帮助。继续前进,我相信你会成功的。

    示例:

    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.uix.button import Button
    from kivy.uix.boxlayout import BoxLayout
    from kivy.core.window import Window
    from kivy.uix.screenmanager import Screen, ScreenManager
    
    Window.size = 600, 400
    
    class Player(Button):
        def __init__(self, name, **kwargs):
            super(Player, self).__init__(**kwargs)
            self.name = name
            self.text = self.name
            self.size_hint = None, None
            self.size = Window.width, Window.height*0.1
            self.on_press = self.hit_the_ball
    
        def hit_the_ball(self):
            self.parent.parent.field.text = self.text + " played his turn!"
    
    class Arena(Screen):
        def __init__(self, players, **kwargs):
            super(Arena, self).__init__(**kwargs)
    
            self.playground = BoxLayout(orientation="vertical", size_hint=(None, None), size=Window.size)
    
            self.field = Label(text="", size_hint=(None, None), size=(Window.width, Window.height*0.8))
    
            self.playground.add_widget(players[0])
            self.playground.add_widget(self.field)
            self.playground.add_widget(players[1])
    
            self.add_widget(self.playground)
    
    
    class MyApp(App):
    
        def build(self):
            player1 = Player(name="Player1")
            player2 = Player(name="Player2")
    
            players_list = (player1, player2)
    
            arena = Arena(players_list)
            WMan  = ScreenManager()
            WMan.add_widget(arena)
    
            return WMan
    
    
    MyApp().run()
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 2022-12-04
      • 1970-01-01
      • 2017-03-04
      • 2017-08-13
      • 2011-08-29
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多