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