【发布时间】: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 很难...
main.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()
main.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()
【问题讨论】: