Python 如何从另一个类/屏幕kivy访问值

Python 如何从另一个类/屏幕kivy访问值,python,class,kivy,screens,Python,Class,Kivy,Screens,我想将弹出窗口中的标签设置为我已经在另一个屏幕/类中声明的值。我该怎么做 class ScreenTwo(Screen): self.result = StringProperty(None) def Winning(self): wp = WinningPopup() wp.open() class WinningPopup(Popup): pass 这是显示两个类的主文件的一部分,一个是屏幕,一个是弹出窗口 <Winnin

我想将弹出窗口中的标签设置为我已经在另一个屏幕/类中声明的值。我该怎么做

class ScreenTwo(Screen):
    self.result = StringProperty(None)

    def Winning(self):
        wp = WinningPopup()
        wp.open()


class WinningPopup(Popup):
    pass
这是显示两个类的主文件的一部分,一个是屏幕,一个是弹出窗口

<WinningPopup>:
    id: winning_popup
        Label:
            id: winning_label
            text: root.parent.ScreenTwo.checkwin.result
:
id:winning_弹出窗口
标签:
id:winning_标签
文本:root.parent.ScreenTwo.checkwin.result

这是弹出窗口的kv文件,试图指示screentwo中为标签文本保留的值,我尝试了root.self.screentwo,尝试了root.checkwin.result,尝试了所有这些组合,但它只是给出了一个无法找到结果的错误。如何将标签中的文本链接到screentwo中存储的值?

这不是正确的python语法,也不是正确的python命名约定。首先,self.result=StringProperty(None)没有意义。只需
result=StringProperty(无)
。此外,函数名必须为小写

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty
from kivy.uix.popup import Popup
from kivy.lang import Builder


layout = """
<WinningPopup>:
    id: winning_popup
    Label:
        id: winning_label
        text: root.result
"""


class ScreenTwo(Screen):
    result = StringProperty('')

    def __init__(self):
        super(ScreenTwo, self).__init__()
        self.add_widget(WinningPopup(self.result))


class WinningPopup(Popup):
    result = StringProperty('')

    def __init__(self, result):
        super(WinningPopup, self).__init__()
        self.result = result


class MyApp(App):
    def build(self):
        Builder.load_string(layout)
        s_m = ScreenManager()
        s_m.add_widget(ScreenTwo())
        return s_m

if __name__ == '__main__':
    MyApp().run()
从kivy.app导入应用
从kivy.uix.screenmanager导入屏幕,screenmanager
从kivy.properties导入StringProperty
从kivy.uix.popup导入弹出窗口
从kivy.lang导入生成器
布局=”“
:
id:winning_弹出窗口
标签:
id:winning_标签
文本:root.result
"""
第二类屏幕(屏幕):
结果=StringProperty(“”)
定义初始化(自):
超级(屏幕二,自我)。\uuuu初始化
self.add_小部件(WinningPopup(self.result))
类WinningPopup(弹出窗口):
结果=StringProperty(“”)
定义初始(自我,结果):
超级(WinningPopup,self)。\uu初始化
self.result=结果
类别MyApp(应用程序):
def生成(自):
生成器.加载字符串(布局)
s_m=屏幕管理器()
s_m.add_小部件(ScreenTwo())
返回s_m
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()

用你的方法做作业更容易,赢了。有关详细信息,请参阅下面的代码片段和示例

一小条 例子 main.py 试验电压(千伏)
#:kivy 1.10.0
:
id:winning_弹出窗口
标签:
id:winning_标签
:
屏幕二:
名称:“屏幕2”
:
输出

例2-蒂克塔克托 nandx.py
从kivy.app导入应用
从kivy.uix.popup导入弹出窗口
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.properties导入ObjectProperty
从kivy.properties导入StringProperty
从kivy.config导入配置
随机输入
导入系统
配置集(“图形”、“宽度”、“420”)
配置集(“图形”、“高度”、“600”)
Config.set(“图形”、“无边框”、“0”)
Config.set(“图形”、“可调整大小”、“0”)
Config.set(“kivy”、“窗口图标”、“nyc.ico”)
班级经理(屏幕经理):
screen_one=ObjectProperty(无)
screen_two=ObjectProperty(无)
一级屏幕(屏幕):
通过
第二类屏幕(屏幕):
playericon=“”
compicon=“”
按钮数组=[11,12,13,21,22,23,31,32,33]
_线的数组_=[[11,12,13]、[11,21,31]、[12,22,32]、[13,23,33]、[21,22,23]、[31,32,33]、[11,22,33],
[13, 22, 31]]
数组\u移动\u玩家=[]
数组\u of \u moves\u comp=[]
结果=StringProperty(“”)
def CHOOSECORO(自动,按选择):
self.ids.choose_o.disabled=True
self.ids.choose_x.disabled=True
如果按选择==“x”:
self.playericon=“x.png”
self.compicon=“circle.png”
x=0
当x<9时:
butt=按钮的自数组[x]
对接=str(对接)
self.ids[butt].disabled=False
x+=1
其他:
self.playericon=“circle.png”
self.compicon=“x.png”
x=0
当x<9时:
butt=按钮的自数组[x]
对接=str(对接)
self.ids[butt].disabled=False
x+=1
返回self.playericon,self.compicon
def MOVEMAKED(自动、按下、按下_以获得_阵列):
self.array\u of_按钮。移除(按_表示_数组)
self.array\u of\u moves\u player.append(按\u键表示\u数组)
pressed.disabled=True
pressed.background\u disabled\u normal=(self.playericon)
如果self.array\u按钮数=[]:
self.checkwin()
其他:
self.checkwin()
self.computersturn()
def computersturn(自我):
lengthof=int(len(按钮的自数组))
compgo=random.randint(0,(长度-1))
compchoice=(按钮的self.array.\uuuu getitem\uuuuu(compgo))
移动的自身数组元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素
compchoice_str=str(compchoice)
del self.按钮数组[compgo]
self.ids[compchoice\u str].disabled=True
self.ids[compchoice\u str]。背景已禁用\u normal=(self.compicon)
self.checkwin()
def checkwin(自我):
结果=StringProperty(“”)
结果列表=0
x=0
当x<8时:

if set(self.array\u of_line[x])感谢您的帮助,但此方法将弹出窗口置于屏幕2的背景中,并且在传递结果时仍会给我一个错误。我发现在弹出窗口中,如果我这样做,x=ScreenTwo(),然后result=x.result,理论上它应该通过它,但是整个过程崩溃了,也没有任何好的错误,总程序崩溃:进程结束,退出代码为-1073741819(0xC0000005)。我的完整代码是:kv文件是:我已经更新了Python脚本和Kivy文件。我还将弹出窗口的大小设置为更小。请参考“示例2”了解详细信息。太好了,谢谢。这对弹出窗口非常有用,我可以看到我对winning()的引用太多了,这把事情搞砸了。我可以看到你是如何将结果传递到弹出窗口的,这很好。我的重置按钮现在不起作用,我需要引用screentwo类中的重置方法。但我会努力的。谢谢你的帮助
class ScreenTwo(Screen):
    result = StringProperty("Testing-1-2-3")

    def Winning(self):
        wp = WinningPopup()
        wp.ids.winning_label.text = self.result
        wp.open()
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.properties import StringProperty


class WinningPopup(Popup):
    pass


class MyScreenManager(ScreenManager):

    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        self.current = "screen2"    # display ScreenTwo


class ScreenTwo(Screen):
    result = StringProperty("Testing-1-2-3")

    def __init__(self, **kwargs):
        super(ScreenTwo, self).__init__(**kwargs)
        self.Winning()  # display popup

    def Winning(self):
        wp = WinningPopup()
        wp.ids.winning_label.text = self.result
        wp.open()


class TestApp(App):

    def build(self):
        return MyScreenManager()


if __name__ == "__main__":
    TestApp().run()
#:kivy 1.10.0

<WinningPopup>:
    id: winning_popup
    Label:
        id: winning_label

<MyScreenManager>:
    ScreenTwo:
        name: "screen2"


<ScreenTwo>:
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.config import Config
import random
import sys

Config.set("graphics", "width", "420")
Config.set("graphics", "height", "600")
Config.set("graphics", "borderless", "0")
Config.set("graphics", "resizable", "0")
Config.set("kivy", "window_icon", "nyc.ico")


class Manager(ScreenManager):
    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)


class ScreenOne(Screen):
    pass


class ScreenTwo(Screen):
    playericon = ""
    compicon = ""
    array_of_buttons = [11, 12, 13, 21, 22, 23, 31, 32, 33]
    array_of_lines = [[11, 12, 13], [11, 21, 31], [12, 22, 32], [13, 23, 33], [21, 22, 23], [31, 32, 33], [11, 22, 33],
                      [13, 22, 31]]
    array_of_moves_player = []
    array_of_moves_comp = []
    result = StringProperty("")

    def choosexoro(self, pressedchoice):
        self.ids.choose_o.disabled = True
        self.ids.choose_x.disabled = True
        if pressedchoice == "x":
            self.playericon = "x.png"
            self.compicon = "circle.png"
            x = 0
            while x < 9:
                butt = self.array_of_buttons[x]
                butt = str(butt)
                self.ids[butt].disabled = False
                x += 1
        else:
            self.playericon = "circle.png"
            self.compicon = "x.png"
            x = 0
            while x < 9:
                butt = self.array_of_buttons[x]
                butt = str(butt)
                self.ids[butt].disabled = False
                x += 1
        return self.playericon, self.compicon

    def movemade(self, pressed, pressed_for_array):
        self.array_of_buttons.remove(pressed_for_array)
        self.array_of_moves_player.append(pressed_for_array)
        pressed.disabled = True
        pressed.background_disabled_normal = (self.playericon)
        if self.array_of_buttons == []:
            self.checkwin()
        else:
            self.checkwin()
            self.computersturn()

    def computersturn(self):
        lengthof = int(len(self.array_of_buttons))
        compgo = random.randint(0, (lengthof - 1))
        compchoice = (self.array_of_buttons.__getitem__(compgo))
        self.array_of_moves_comp.append(compchoice)
        compchoice_str = str(compchoice)
        del self.array_of_buttons[compgo]
        self.ids[compchoice_str].disabled = True
        self.ids[compchoice_str].background_disabled_normal = (self.compicon)
        self.checkwin()

    def checkwin(self):
        result = StringProperty("")
        resultlist = 0
        x = 0
        while x < 8:
            if set(self.array_of_lines[x]) <= set(self.array_of_moves_player):
                resultlist = 1
                # self.Winning()
                break
            else:
                x += 1
        x = 0
        while x < 8:
            if set(self.array_of_lines[x]) <= set(self.array_of_moves_comp):
                resultlist = 2
                # self.Winning()
                break
            else:
                x += 1
        if resultlist == 0 and self.array_of_buttons == []:
            resultlist = 3
            # self.Winning()
        if resultlist == 1:
            result = "You Win!"
            self.Winning(result)
        elif resultlist == 2:
            result = "The Computer Wins!"
            self.Winning(result)
        elif resultlist == 3:
            result = "It´s a Draw!"
            self.Winning(result)

        return self.result

    def Winning(self, result):
        wp = WinningPopup(size_hint=(None, None), size=(400, 400))
        wp.ids.winning_label.text = result
        wp.open()

    def resetgame(self):
        self.array_of_moves_player = []
        self.array_of_moves_comp = []
        self.array_of_buttons = [11, 12, 13, 21, 22, 23, 31, 32, 33]
        x = 0
        while x <= 8:
            butt = self.array_of_buttons[x]
            butt = str(butt)
            self.ids[butt].background_disabled_normal = ("blank.png")
            butt = int(butt)
            x += 1

        self.ids.choose_x.disabled = False
        self.ids.choose_o.disabled = False
        self.ids.top_player.text = "Player 1"
        self.ids.bottom_player.text = "Player 2"


class WinningPopup(Popup):

    def quitgame(self):
        sys.exit(0)


class nandxApp(App, ScreenTwo):
    def build(self):
        self.title = "Noughts and Crosses"
        return Manager()


if __name__ == "__main__":
    nandxApp().run()
#:kivy 1.0
#:import hex kivy.utils.rgba

<Manager>:

    ScreenOne:
        id: screen_one

    ScreenTwo:
        id: screen_two


<ScreenOne>:

    id: screen_one
    name: "screen1"
    GridLayout:
        size_hint: (.5, .5)
        pos_hint: {"center_x":0.5,"center_y":0.6}
        rows: 3
        padding: 20

        Label:
            size_hint: (.2, .2)
            text: "Please enter\nyour name:"
            font_size: 30
            halign: 'center'
            valign: 'middle'

        TextInput:
            size_hint: (.2, .06)
            cursor_blink: True
            font_size: 20
            multiline: 0
            id: player_name

        Button:
            size_hint: (.2, .08)
            text: "Continue"
            on_release:
                root.manager.current = "screen2"
                root.manager.ids.screen_two.ids.final_playername.text=player_name.text

<ScreenTwo>:
    id: screen_two
    name: "screen2"
    GridLayout:
        cols: 3
        size: root.size
        spacing: 10
        padding: 10

        Button:
            id: 11
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 11)

        Button:
            id: 12
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 12)

        Button:
            id: 13
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 13)

        Button:
            id: 21
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 21)

        Button:
            id: 22
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 22)

        Button:
            id: 23
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 23)

        Button:
            id: 31
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 31)

        Button:
            id: 32
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 32)

        Button:
            id: 33
            disabled: True
            background_normal: ("blank.png")
            background_disabled_normal: ("blank.png")
            on_release:
                root.movemade(self, 33)

        Button:
            id: choose_x
            background_normal: ("x.png")
            background_disabled_normal: ("x.png")
            on_release:
                root.choosexoro("x")
                root.ids.top_player.text=("<--"+(root.ids.final_playername.text))
                root.ids.bottom_player.text=("Computer -->")

        GridLayout:
            rows: 2

            Label:
                id: top_player
                font_size: 20
                bold: True
                color: (.67,.3,.95,1)
                text: "Player 1"

            Label:
                id: bottom_player
                font_size: 20
                bold: True
                color: (.67,.3,.95,1)
                text: "Player 2"

        Button:
            id: choose_o
            background_normal: ("circle.png")
            background_disabled_normal: ("circle.png")
            on_release:
                root.choosexoro("o")
                root.ids.bottom_player.text=("<--"+(root.ids.final_playername.text))
                root.ids.top_player.text=("Computer -->")

        GridLayout:
            rows: 3

            Label:
                id: final_playername
                font_size: 20
                bold: True
                color: (0,1,0,1)
                text: ""

            Label:
                font_size: 20
                bold: True
                color: (1,0,0,1)
                text: "Score:"

            Label:
                id: userscore
                font_size: 20
                bold: True
                color: (1,0,0,1)
                text: "0"

        Label:
            text: ""

        GridLayout:
            rows: 3

            Label:
                font_size: 20
                bold: True
                color: (0,1,0,1)
                text: "Computer"

            Label:
                font_size: 20
                bold: True
                color: (1,0,0,1)
                text: "Score:"

            Label:
                id: computerscore
                font_size: 20
                bold: True
                color: (1,0,0,1)
                text: "0"


<WinningPopup>:
    id: winning_popup
    name: "WinningPopup"
    title: "Winner!"

    GridLayout:
        size: root.size
        spacing: 30
        padding: 30
        cols: 1

        Label:
            id: winning_label
            font_size: 30
            bold: True
            color: (.5,.5,.5,1)
            text: "Unknown"     #root.result

        Button:
            text: "Play Again"
            on_release:
                root.resetgame()
                root.dismiss()

        Button:
            text: "Quit"
            on_release: root.quitgame()