Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Kivy-在其他屏幕中创建的Access实例_Python_Class_Kivy_Kivy Language - Fatal编程技术网

Python Kivy-在其他屏幕中创建的Access实例

Python Kivy-在其他屏幕中创建的Access实例,python,class,kivy,kivy-language,Python,Class,Kivy,Kivy Language,我在第一个屏幕中创建了一个类(Player类)的一些实例,并希望在另一个屏幕中访问这些实例(及其数据)。这个想法是: 玩家类:该类的实例包含玩家名称及其点数。(已完成) WelcomeWindow(Screen)类:通过TextInput提取玩家姓名+创建玩家类实例并分配姓名。(已完成) 第三(屏幕)类:访问播放器实例的名称和点数,在标签上显示名称,并在按下+/-按钮时更改播放器点数。(问题) 我在下面的代码中标记了试图访问实例的位置,但出现了错误: AttributeError: 'Non

我在第一个屏幕中创建了一个类(Player类)的一些实例,并希望在另一个屏幕中访问这些实例(及其数据)。这个想法是:

  • 玩家类
    :该类的实例包含玩家名称及其点数。(已完成)
  • WelcomeWindow(Screen)类
    :通过TextInput提取玩家姓名+创建玩家类实例并分配姓名。(已完成)
  • 第三(屏幕)类
    :访问播放器实例的名称和点数,在标签上显示名称,并在按下+/-按钮时更改播放器点数。(问题)
我在下面的代码中标记了试图访问实例的位置,但出现了错误:

AttributeError: 'NoneType' object has no attribute 'get_screen'
我的问题是:如何访问
第三(屏幕)类中的玩家点数,以便在标签上显示他们的点数,并在按下+/-按钮时更改点数

(我搜索了类似的案例,但无法将其应用于我的案例。)

.py文件:

from kivy.app import App
from kivy.lang import Builder
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
from kivy.properties import ObjectProperty, NumericProperty


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"

        # Create global layout of HOME screen
        global_layout = GridLayout(rows=3)
        self.add_widget(global_layout)

        # Some code with labels and buttons

        # 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):
        #Give names to players
        self.player1 = Player("name1") # <--- 4 player instances are created here
        self.player2 = Player("name2")
        self.player3 = Player("name3")
        self.player4 = Player("name4")

        self.manager.current = "thirdround"
        self.manager.transition.direction = "left"


class ThirdRound(Screen):
    def __init__(self, **kwargs):
        super(ThirdRound, self).__init__(**kwargs)
        self.name = "thirdround"

        welcome_window = self.manager.get_screen('welcomewindow') # <--- Trying to access player instances here but failed
        self.player1_points = welcome_window.player1.points


    def change_label(self, add_sub, *args): # <--- method which will change the points of the player instance

        label = self.ids['testlabel']
        if add_sub == 'add':
            label.text = 'should add one point'
        elif add_sub == 'sub':
            label.text = 'should subtract one point'


kv = Builder.load_file("Kingen.kv")

WindowManager = ScreenManager()
WindowManager.add_widget(WelcomeWindow())
WindowManager.add_widget(ThirdRound())


class KingenApp(App):

    def build(self):
        return WindowManager


if __name__ == "__main__":
    KingenApp().run()
<ThirdRound>:

    GridLayout:
        rows: 3

        Label:
            id: testlabel
            text: 'shows number of points here'

        Button:
            text: "+"
            on_release: root.change_label('add')

        Button:
            text: "-"
            on_release: root.change_label('sub')
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.textinput导入textinput
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.button导入按钮
从kivy.uix.label导入标签
从kivy.properties导入ObjectProperty、NumericProperty
职业球员:
定义初始化(self,name):
self.name=名称
self.points=0
def重置_点(自身):
self.points=0
def添加点(自身,*参数):
self.points+=1
def减去_点(自身,*args):
self.points-=1
类窗口(屏幕):
#介绍4名球员的名字
定义初始(自我,**kwargs):
超级(WelcomeWindow,self)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.name=“welcomewindow”
#创建主屏幕的全局布局
全局布局=网格布局(行数=3)
self.add_小部件(全局_布局)
#一些带有标签和按钮的代码
#创建按钮以转到下一屏幕
继续前进按钮=按钮(text=“进入第一轮”)
go\u further\u按钮.bind(on\u release=self.go\u further)
全局布局。添加小部件(继续按钮)
def go_进一步(自我,*参数):
#点名
self.player1=Player(“name1”)\

WindowManager.add_widget(ThirdRound())
具体来说,
thirdrund()
是在
WindowManager.add\u小部件
之前执行的,因此
thirdrund
实例在执行其
\uu init\uu()
时尚未设置其
管理器,因此它仍然是
None
。尝试移动访问
管理器的代码,直到需要为止。大概是这样的:

class ThirdRound(Screen):
    def __init__(self, **kwargs):
        super(ThirdRound, self).__init__(**kwargs)
        self.name = "thirdround"

    def change_label(self, add_sub, *args): # <--- method which will change the points of the player instance
        welcome_window = self.manager.get_screen('welcomewindow')

        label = self.ids['testlabel']
        if add_sub == 'add':
            welcome_window.player1.points += 1
            label.text = str(welcome_window.player1.points)
        elif add_sub == 'sub':
            welcome_window.player1.points -= 1
            label.text = str(welcome_window.player1.points)
第三级(屏幕):
定义初始(自我,**kwargs):
超级(第三个,自我)。\uuuuu初始(**kwargs)
self.name=“第三方”

def change_标签(self,add_sub,*args):#谢谢,您解释得很清楚,现在就有意义了!