您的代码有几个问题:
- The
__init__()
任何方法Widget
当您创建该实例时调用Widget
。所以__init__()
的方法FirstRound
被称为在线WindowManager.add_widget(FirstRound())
。此时还无法输入任何文本TextInput
of WelcomeWindow
,所以你无法获取当时的玩家名字。
- 的创建
Player
实例 (self.player1 = Player(name_input_player_i.text)
)创建Player
在用户有机会输入玩家姓名之前的实例。
- 指某东西的用途
WelcomeWindow()
in the __init__()
的方法FirstRound
创建一个新实例WelcomeWindow
这与你的 GUI 中的无关。因此从该实例中提取的任何信息都是没有用的。
- In your
FirstRound
,玩家点标签从Player
当时的类实例Label
被建造。改变points
的属性Player
之后不会有任何影响Label
.
第一个问题可以通过将大部分代码移出__init__()
的方法FirstRound
,并将其放入on_enter()
时运行的方法Screen
被展示。
第二个问题可以通过移动创建Player
实例进入go_further()
方法,因为它在离开时执行WelcomeWindow
.
第三个问题可以通过替换这些用途来解决WelcomeWindow()
with self.manager.get_screen('welcomewindow')
访问实际实例WelcomeWindow
那是在你的 GUI 中。
这是代码的修改版本,它执行这三件事:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class Player:
def __init__(self, name):
self.name = name
self.points = 0
def reset_points(self):
self.points = 0
def add_point(self, *args):
self.points += 1
def subtract_point(self, *args):
self.points -= 1
class WelcomeWindow(Screen):
# Introduce names of the 4 players
def __init__(self, **kwargs):
super(WelcomeWindow, self).__init__(**kwargs)
self.name = "welcomewindow"
self.layout = "layout_welcome_window"
global_layout = GridLayout(rows=3)
self.add_widget(global_layout)
label_player_i = Label(text="Name Player ")
global_layout.add_widget(label_player_i)
self.name_input_player_i = TextInput(id="player ", text="player", multiline=False) # <--- user inputs name here
global_layout.add_widget(self.name_input_player_i)
# Create button to go to next screen
go_further_button = Button(text="Go to first round")
go_further_button.bind(on_release=self.go_further)
global_layout.add_widget(go_further_button)
def go_further(self, *args):
self.player1 = Player(self.name_input_player_i.text) # <--- name is assigned to player here
self.manager.current = "firstround"
self.manager.transition.direction = "left"
class FirstRound(Screen):
#Give explanation of first round + option to add points for every player
def __init__(self, **kwargs):
super(FirstRound, self).__init__(**kwargs)
self.name = "firstround"
self.layout = "layout_first_round"
def on_enter(self, *args):
#Create layout
global_layout = GridLayout(rows=4)
self.add_widget(global_layout)
#Create Labels
welcome_window = self.manager.get_screen('welcomewindow') # get a reference to the WelcomeWindow instance
label_player_name_i = Label(text=welcome_window.player1.name) # <--- Label should get the name of the player here
global_layout.add_widget(label_player_name_i)
label_player_points_i = Label(text=str(welcome_window.player1.points)) # <--- Label should get points of player
global_layout.add_widget((label_player_points_i))
#Create Buttons
button_minus = Button(text="-", font_size=100, id="minus_button")
button_minus.bind(on_release=welcome_window.player1.subtract_point) # <--- When button pushed: should subtract point
global_layout.add_widget(button_minus)
button_plus = Button(text="+", font_size=100, id="plus_button")
button_plus.bind(on_release=welcome_window.player1.add_point) # <--- When button pushed: should add point
global_layout.add_widget(button_plus)
WindowManager = ScreenManager()
WindowManager.add_widget(WelcomeWindow())
WindowManager.add_widget(FirstRound())
class KingenApp(App):
def build(self):
return WindowManager
if __name__ == "__main__":
KingenApp().run()
第四个问题本身值得一个问题,但可能涉及使用 kivy 语言。