python - 'NoneType' 对象在 kivy 上没有属性 'root'
问题描述
我需要将值传递给 kivy 上的另一个类(屏幕)这是我的 py 代码:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
class MyLayout(Screen):
pstd=ObjectProperty(None)
def save():
pass
def calculate(self):
pstd=self.pstd.text
pres=self.pres.text
tres=self.tres.text
tsep=self.tsep.text
psep=self.psep.text
api=self.api.text
dg=self.sg.text
pb=self.pb.text
co2=self.co2.text
h2s=self.h2s.text
n2=self.n2.text
tds=self.tds.text
if(self.sat.state == "down"):
cond = 2
else :
cond = 1
print(pstd)
return pstd
class MyLayout2(Screen):
def __init__(self,**kwargs):
print(App.get_running_app().root.get_screen('main').calculate())
class WindowManager(ScreenManager):
pass
kv = Builder.load_file("tubes1.kv")
class TubesApp(App):
my_layout = MyLayout()
def build(self):
return kv
if __name__ == "__main__":
TubesApp().run()
这是我的 kv 代码:
WindowManager:
MyLayout:
MyLayout2:
<MyLayout>:
name: "main"
free:free
sat:sat
pstd:pstd
tres:tres
pres:pres
tsep:tsep
psep:psep
api:api
sg:sg
pb:pb
co2:co2
h2s:h2s
n2:n2
tds:tds
btn:btn
background_color : 71/255,213/255,223/255,1
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
FloatLayout :
size : root.width,root.height
Label :
text : "PVT Calculator"
font_size : 20
size_hint : (None,None)
size : 400,100
color: 1,1,1,1
pos_hint : {"center_x":0.5,"top" : 1}
background_color : (35/255,135/255,142/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
text : "Oil Data"
font_size : 20
size_hint : (0.5,0.09)
color: 0.3,0.4,0.5,1
pos_hint : {"center_x":0.25,"top" : 0.8}
background_color : (71/255,220/255,141/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
text : "API"
font_size : 12
size_hint : (0.25,0.04)
color: 1,1,1,1
pos_hint : {"x":0, "top":0.712}
background_color : (5/255,95/255,53/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:api
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.25, "top":0.712}
Label :
text : "Saturation pressure"
font_size : 12
size_hint : (0.25,0.04)
color: 1,1,1,1
pos_hint : {"x":0, "top":0.672}
background_color : (6/255,124/255,69/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:pb
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.25, "top":0.672}
Label :
text : "Spesific Gravity"
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0, "top":0.632}
color: 1,1,1,1
background_color : (8/255,152/255,85/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:sg
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.25, "top":0.632}
Label :
text : "Non-Hydrocarbon Component"
font_size : 20
size_hint : (0.5,0.09)
color: 0.3,0.4,0.5,1
pos_hint : {"center_x":0.75,"top" : 0.8}
background_color : (14/255,195/255,110/225,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
text : "CO2"
font_size : 12
size_hint : (0.25,0.04)
color: 1,1,1,1
pos_hint : {"x":0.5, "top":0.712}
background_color : (5/255,95/255,53/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:co2
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.75, "top":0.712}
Label :
text : "H2S"
font_size : 12
size_hint : (0.25,0.04)
color: 1,1,1,1
pos_hint : {"x":0.5, "top":0.672}
background_color : (6/255,124/255,69/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:h2s
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.75, "top":0.672}
Label :
text : "N2"
font_size : 12
size_hint : (0.25,0.04)
color: 1,1,1,1
pos_hint : {"x":0.5, "top":0.632}
background_color : (8/255,152/255,85/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:n2
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.75, "top":0.632}
Label :
text : "Reservoir and Separator Data"
font_size : 20
size_hint : (0.5,0.09)
color: 0.3,0.4,0.5,1
pos_hint : {"center_x":0.25,"top" : 0.5}
background_color : (14/255,195/255,110/225,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
text : "Reservoir Temperature"
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0, "top":0.41}
color: 1,1,1,1
background_color : (5/255,95/255,53/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:tres
multiline:False
font_size : 12
size_hint : (0.25,0.04)
pos_hint : {"x":0.25, "top":0.41}
Label :
text : "Initial Reservoir pressure"
font_size : 12
size_hint : (None,None)
size : 200,25
color: 1,1,1,1
pos : 0,200
background_color : (6/255,124/255,69/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:pres
multiline:False
font_size : 12
size_hint : (None,None)
size : 200,25
pos : 200,200
Label :
text : "Separator Temperature"
font_size : 12
size_hint : (None,None)
size : 200,25
color: 1,1,1,1
pos : 0,175
background_color : (8/255,152/255,85/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:tsep
multiline:False
font_size : 12
size_hint : (None,None)
size : 200,25
pos : 200,175
Label :
text : "Separator pressure"
font_size : 12
size_hint : (None,None)
size : 200,25
color: 1,1,1,1
pos : 0,150
background_color : (9/255,181/255,101/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:psep
multiline:False
font_size : 12
size_hint : (None,None)
size : 200,25
pos : 200,150
Label :
text : "Standard pressure"
font_size : 12
size_hint : (None,None)
size : 200,25
color: 1,1,1,1
pos : 0,125
background_color : (10/255,209/255,116/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:pstd
multiline:False
font_size : 12
size_hint : (None,None)
size : 200,25
pos : 200,125
Label :
text : "Water Formation Data"
font_size : 20
size_hint : (0.5,0.09)
color: 0.3,0.4,0.5,1
pos_hint : {"center_x":0.75,"top" : 0.5}
background_color : (71/255,220/255,141/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
size_hint : (None,None)
size : 400,125
color: 0.3,0.4,0.5,1
pos: 400,125
background_color : (5/255,95/255,53/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
Label :
text : "Condition"
font_size : 12
size_hint : (None,None)
size : 400,25
color: 1,1,1,1
pos : 400,225
background_color : (6/255,124/255,69/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
ToggleButton :
id:sat
text : "Gas-Saturated Brine"
size_hint : (None,None)
size : 180, 60
pos : 420, 155
group : 'Condition'
ToggleButton :
id:free
text : "Gas-Free Brine"
size_hint : (None,None)
size : 180, 60
pos : 610, 155
group : 'Condition'
state: "normal"
Label :
text : "Total Dissolved Solid"
font_size : 12
size_hint : (None,None)
size : 200,25
color: 1,1,1,1
pos : 400,125
background_color : (10/255,209/255,116/255,1)
canvas.before:
Color :
rgba : self.background_color
Rectangle :
size : self.size
pos : self.pos
TextInput :
id:tds
multiline:False
font_size : 12
size_hint : (None,None)
size : 200,25
pos : 600,125
Button :
id:btn
text : "CALCULATE"
size_hint : (None,None)
size : 180, 60
pos_hint : {"center_x":0.5,"y":0.05}
on_press : root.calculate()
on_release : app.root.current = "second"
<MyLayout2>:
name : "second"
ubah:ubah
GridLayout :
cols : 1
Label :
id:ubah
text : "test"
Button :
text : "Back"
on_press : root.press()
on_release : app.root.current = "main"
如果我使用 def ...() 而不是 def init () 它可以工作,但在这种情况下我需要使用init 。当我使用 App.get_running_app().root.get_screen('second').press() 时,它总是说'NoneType'对象没有属性'root'
解决方案
这些变化应该会有所帮助。
添加超级方法,我还添加了一个打印语句,仅供参考。
class MyLayout(Screen):
def __init__(self, **kwargs):
super().__init__()
print(kwargs)
并且还在这个类中在init _ 方法中添加超级调用。我还添加了一个方法press,它连接到您在 .kv 文件中输入的按钮按下事件。App.get_running_app() 在这种情况下不起作用的原因是因为在初始化时 run() 方法还没有执行。它此时没有运行......所以我评论了你的行
class MyLayout2(Screen):
def __init__(self, **kwargs):
super().__init__()
print(kwargs)
# print(App.get_running_app().root.get_screen('main').calculate())
def press(self):
print("you pressed Back from {}".format(self))
我在这里添加了一个on_start方法和一些可能对您有所帮助的打印语句。老实说,此时我不知道 calculate() 语句的目的是什么。
class TubesApp(App):
my_layout = MyLayout()
def build(self):
return kv
def on_start(self) -> None:
print(type(App.get_running_app()))
print(type(App.get_running_app().root))
print(type(App.get_running_app().root.get_screen('main')))
# print(App.get_running_app().root.get_screen('main').calculate())
通过这些更改,您的应用程序启动并在按下计算按钮时移动到第二个窗口,并在按下返回按钮时返回
推荐阅读
- c# - 在 Windows 窗体 Picturebox C# 中插入屏幕截图
- bootstrapper - Wix Bootstrapper 不会打开 wpf ui
- amazon-web-services - AWS 私有子网中的 LDAP 访问
- three.js - Three.js 加载已经三角剖分的网格是否比使用四边形的网格更高效?
- python - 如果在一切运行前几天,为什么我们的 GAN 训练会产生错误?
- php - 如何使用其相关模型获取模型
- c# - 在 Agora.io 视频通话后 Unity VideoPlayer 音频中断
- python - 使用 modbus_tk 向 RS-485 写入 8 位
- mysql - 为 mySQL 设置全局变量
- sql - 如何将 BigQuery 中的字符串分成多列而不分解不同的单词?