Python 为什么全局变量在开始时不更新,但在按下按钮时更新?

Python 为什么全局变量在开始时不更新,但在按下按钮时更新?,python,kivy,Python,Kivy,我开始使用kivy开发这个小型计算器,我有两个窗口。一个带计算器,一个带结果。我有4个操作按钮,当我按下其中一个按钮时,我想进入第二个窗口,在那里我有一个标签,应该是结果。我将结果存储在一个全局变量中。当我更改windows时,标签会用全局变量的默认值更新,但如果我按下按钮,我可以用最新的更新。有人能解释为什么吗 导入时间 从kivy.app导入应用程序 从kivy.uix.screenmanager导入screenmanager,屏幕 从kivy.properties导入ObjectPrope

我开始使用kivy开发这个小型计算器,我有两个窗口。一个带计算器,一个带结果。我有4个操作按钮,当我按下其中一个按钮时,我想进入第二个窗口,在那里我有一个标签,应该是结果。我将结果存储在一个全局变量中。当我更改windows时,标签会用全局变量的默认值更新,但如果我按下按钮,我可以用最新的更新。有人能解释为什么吗

导入时间 从kivy.app导入应用程序 从kivy.uix.screenmanager导入screenmanager,屏幕 从kivy.properties导入ObjectProperty 从kivy.lang导入生成器 从kivy.properties导入StringProperty ResultVariable=-1 类计算器窗口屏幕: numberone=ObjectPropertyOne numbertwo=ObjectPropertyNone def additionself: 全局结果变量 sm.电流=结果 ResultVariable=intself.numberone.text+intself.numbertwo.text ResultWindow.updatevalue 打印结果可变 def减法本身: 通过 def乘法自身: 通过 自我定义: 通过 类别结果屏幕: 结果\u编号=StringProperty 定义初始自我,**kwargs: superResultWindow,self.\uuuuu init\uuuuuu**kwargs self.updatevalue def updatevalueself: printIt已进入函数 self.result\u number=strResultVariable def restartself: self.result\u number=strResultVariable sm.电流=计算器 类WindowManager ScreenManager: 通过 kv=Builder.load\u filegraphics.kv sm=窗口管理器 屏幕=[CalculatorWindowname=计算器,ResultDownName=结果] 对于屏幕中的屏幕: sm.add_widgetscreen sm.current=计算器 MyMainAppApp类: def buildself: 返回sm 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: MyMainApp.run 打印程序结束 这是kivy

<CalculatorWindow>:
    name: "Calculator"

    numberone: firstone
    numbertwo: secondone

    FloatLayout:
        Label:
            text: "First number"
            pos_hint: {"x":0.0, "top":0.8}
            size_hint: 0.5, 0.1

        Label:
            text: "Second number"
            pos_hint: {"x":0.0, "top":0.6}
            size_hint: 0.5, 0.1

        TextInput:
            pos_hint: {"x":0.5, "top":0.8}
            size_hint: 0.4, 0.1
            id: firstone
            multiline: False

        TextInput:
            pos_hint: {"x":0.5, "top":0.6}
            size_hint: 0.4, 0.1
            id: secondone
            multiline: False

        Button:
            text: "+"
            pos_hint: {"x":0.04, "top":0.35}
            size_hint: 0.2, 0.2
            on_release:
                root.manager.transition.direction = "left"
                root.addition()

        Button:
            text: "-"
            pos_hint: {"x":0.28, "top":0.35}
            size_hint: 0.2, 0.2
            on_release:
                root.manager.transition.direction = "left"
                root.addition()

        Button:
            text: "*"
            pos_hint: {"x":0.52, "top":0.35}
            size_hint: 0.2, 0.2
            on_release:
                root.manager.transition.direction = "left"
                root.addition()

        Button:
            text: "/"
            pos_hint: {"x":0.76, "top":0.35}
            size_hint: 0.2, 0.2
            on_release:
                root.manager.transition.direction = "left"
                root.addition()


<ResultWindow>
    name: "Result"

    resultvariable:solution

    FloatLayout:
        Label:
            id: solution
            text: root.result_number
            pos_hint: {"x":0.0, "top":0.8}
            size_hint: 0.5, 0.1

        Button:
            text: "Reset"
            pos_hint: {"x":0.1, "top":0.6}
            size_hint: 0.8, 0.4
            on_release:
                root.manager.transition.direction = "right"
                root.restart()
使用

创建类ResultWindow的新实例,该实例与在中创建的diplayed窗口无关

screens = [CalculatorWindow(name="Calculator"), ResultWindow(name="Result")]
你必须使用

screens[1].updatevalue()
编辑:您也可以尝试使用on_enter in ResultWidow,当kivy显示屏幕时,它可能会每次更新,但您可以看到在滚动屏幕后值是如何变化的。我试着用on_pre_enter做同样的事情,但对我来说不起作用。看


欢迎来到堆栈溢出!您发布的代码比我需要或想要挖掘的代码多,无法找到您的问题。请尝试提供包含您的问题的代码的较小示例。请参阅下面的操作指南:我在输入时添加了带有事件的examlpe,但它的更改太晚了,所以您可以看到它是如何更改的。on_pre_enter对我不起作用,但它应该在管理员更改屏幕之前更新值。
screens[1].updatevalue()
import time
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.properties import StringProperty

ResultVariable = -1

class CalculatorWindow(Screen):

    numberone = ObjectProperty(None)
    numbertwo = ObjectProperty(None)

    def addition(self):
        global ResultVariable
        sm.current = "Result"
        ResultVariable = int(self.numberone.text)+int(self.numbertwo.text)
        screens[1].updatevalue()
        print(ResultVariable)

    def substraction(self):
        pass

    def multiplication(self):
        pass

    def division(self):
        pass


class ResultWindow(Screen):

    result_number = StringProperty()

    def __init__(self, **kwargs):
        #super(ResultWindow, self).__init__(**kwargs)
        super().__init__(**kwargs)
        self.updatevalue()

    def updatevalue(self):
        print("It has entered the function")
        self.result_number = str(ResultVariable)

    def restart(self):
        self.result_number = str(ResultVariable)
        #sm.current="Calculator"


class WindowManager(ScreenManager):
    pass


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

sm = WindowManager()

screens = [CalculatorWindow(name="Calculator"), ResultWindow(name="Result")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "Calculator"

class MyMainApp(App):
    def build(self):
        return sm


if __name__ == "__main__":
    MyMainApp().run()
import time
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.properties import StringProperty

ResultVariable = -1

class CalculatorWindow(Screen):

    numberone = ObjectProperty(None)
    numbertwo = ObjectProperty(None)

    def addition(self):
        global ResultVariable
        sm.current = "Result"
        ResultVariable = int(self.numberone.text)+int(self.numbertwo.text)
        #screens[1].updatevalue()
        print(ResultVariable)

    def substraction(self):
        pass

    def multiplication(self):
        pass

    def division(self):
        pass


class ResultWindow(Screen):

    result_number = StringProperty()

    def __init__(self, **kwargs):
        #super(ResultWindow, self).__init__(**kwargs)
        super().__init__(**kwargs)
        self.updatevalue()

    def updatevalue(self):
        print("It has entered the function")
        self.result_number = str(ResultVariable)

    def restart(self):
        self.result_number = str(ResultVariable)
        #sm.current="Calculator"

    def on_enter(self):
        self.updatevalue()

class WindowManager(ScreenManager):
    pass


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

sm = WindowManager()

screens = [CalculatorWindow(name="Calculator"), ResultWindow(name="Result")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "Calculator"

class MyMainApp(App):
    def build(self):
        return sm


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