在 KivyMd.Kivy 中将文本输入从一个屏幕传递到另一个屏幕
Passing a text input from one screen to another in KivyMd.Kivy
我一直在阅读如何执行此操作,但我无法理解给出的答案。我对 kivy 还是个新手,通常在 python 的数据方面工作。我正在尝试将 ID 为 client_name 的文本输入传递到标记为 Second 的第二个屏幕,并将其传递给 ID 为 client_label 的 MDlabel。我可能走错了方向,我认为我的问题是我混淆了 class 和实例,但不确定如何纠正这个问题。
当按下第一个屏幕上的按钮时,它应该保存客户端名称的值,然后转换到第二个屏幕。我需要以某种方式在我的第二个屏幕上访问该值。
我的py文件是main.py
from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os
#Define our different Screens
class FirstWindow(Screen):
def press(self):
client_name = self.ids.client_name.text
print(client_name)
#test()
if client_name == '':
pass
else:
if not os.path.exists("clients/" + client_name):
os.makedirs("clients/" + client_name)
if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
os.makedirs("clients/" + client_name+"/LoanAgreement/")
if not os.path.exists("clients/" + client_name+"/MortgageBond/"):
os.makedirs("clients/" + client_name+"/MortgageBond/")
if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):
os.makedirs("clients/" + client_name+"/CertificateOfBalance/")
class SecondWindow(Screen):
client_name_label = StringProperty()
def label_name(self):
select_screen = self.manager.get_screen("First")
client_name_label = select_screen.ids.client_name.text
print(client_name_label)
class WindowManager(ScreenManager):
pass
#Designate our .kv design file
#kv = Builder.load_file('law.kv')
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
return Builder.load_file('law.kv')
我的 .kv 文件是
WindowManager:
FirstWindow:
SecondWindow:
<FirstWindow>:
name: "First"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDCard:
size_hint: None, None
size: "400", "150"
padding: 10
pos_hint: {"center_x": .5, "center_y": .5}
orientation: "vertical"
MDTextField:
id: client_name
padding: 20, 20, 50, 20
hint_text: "Type a client name"
helper_text: "This will create a file for the client"
#mode: "rectangle"
size_hint_x: None
width: 350
helper_text_mode: "on_focus"
pos_hint: {"center_x": 0.5, "center_y": 1.0}
on_text_validate: root.press()
on_text_validate: app.root.current = "Second"
MDRaisedButton:
text: "Create"
pos_hint: {"center_x": .8}
#md_bg_color: app.theme_cls.primary_light
on_release:
root.press()
app.root.transition.direction = 'left'
app.root.current = "Second"
root.manager.current_screen.label_name()
<SecondWindow>:
name: "Second"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDLabel:
id: client_label
text: root.client_name_label
halign: "center"
background_color: (1, 1, 1, 1)
pos_hint: {"center_x": .5, "center_y": 0.9}
为了从任何地方访问 SecondWindow 或 FirstWindow,请在您的 .kv
文件中尝试以下操作:
- 为每个屏幕添加
id
引用:
WindowManager:
FirstWindow:
id: screen1
SecondWindow:
id: screen2
- 在您的构建方法中引用根目录:
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
self.root = Builder.load_file('law.kv')
return self.root
现在您可以从任何地方访问您的 Windows:
App.get_running_app().root.ids.screen1 #To acces FirstWindow
App.get_running_app().root.ids.screen2 #To acces SecondWindow
最后,要从 .py
文件修改 client_label
的文本:
App.get_running_app().root.ids.screen2.name = 'Changed!'
基于上述答案只是为了扩展我粘贴了有效的完整解决方案:
py
from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os
#Define our different Screens
class FirstWindow(Screen):
def press(self):
client_name = self.ids.client_name.text
print(client_name)
#test()
if client_name == '':
pass
else:
if not os.path.exists("clients/" + client_name):
os.makedirs("clients/" + client_name)
if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
os.makedirs("clients/" + client_name+"/LoanAgreement/")
if not os.path.exists("clients/" + client_name+"/MortgageBond/"):
os.makedirs("clients/" + client_name+"/MortgageBond/")
if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):
os.makedirs("clients/" + client_name+"/CertificateOfBalance/")
MDApp.get_running_app().root.ids.screen2.ids.client_label.text = self.ids.client_name.text # This updates screen2 label
class SecondWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
#Designate our .kv design file
#kv = Builder.load_file('law.kv')
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
self.root = Builder.load_file('law.kv')
return self.root
if __name__ == '__main__':
MainApp().run()
kv 文件
WindowManager:
FirstWindow:
id: scrren1
SecondWindow:
id: screen2
<FirstWindow>:
name: "First"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDCard:
size_hint: None, None
size: "400", "150"
padding: 10
pos_hint: {"center_x": .5, "center_y": .5}
orientation: "vertical"
MDTextField:
id: client_name
padding: 20, 20, 50, 20
hint_text: "Type a client name"
helper_text: "This will create a file for the client"
#mode: "rectangle"
size_hint_x: None
width: 350
helper_text_mode: "on_focus"
pos_hint: {"center_x": 0.5, "center_y": 1.0}
on_text_validate: root.press()
on_text_validate: app.root.current = "Second"
MDRaisedButton:
text: "Create"
pos_hint: {"center_x": .8}
#md_bg_color: app.theme_cls.primary_light
on_release:
root.press() # this function will update screen 2s label
app.root.transition.direction = 'left'
app.root.current = "Second"
<SecondWindow>:
name: "Second"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDLabel:
id: client_label
text: '' # This will change when the previous screens button is pressed
halign: "center"
background_color: (1, 1, 1, 1)
pos_hint: {"center_x": .5, "center_y": 0.9}
我一直在阅读如何执行此操作,但我无法理解给出的答案。我对 kivy 还是个新手,通常在 python 的数据方面工作。我正在尝试将 ID 为 client_name 的文本输入传递到标记为 Second 的第二个屏幕,并将其传递给 ID 为 client_label 的 MDlabel。我可能走错了方向,我认为我的问题是我混淆了 class 和实例,但不确定如何纠正这个问题。 当按下第一个屏幕上的按钮时,它应该保存客户端名称的值,然后转换到第二个屏幕。我需要以某种方式在我的第二个屏幕上访问该值。
我的py文件是main.py
from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os
#Define our different Screens
class FirstWindow(Screen):
def press(self):
client_name = self.ids.client_name.text
print(client_name)
#test()
if client_name == '':
pass
else:
if not os.path.exists("clients/" + client_name):
os.makedirs("clients/" + client_name)
if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
os.makedirs("clients/" + client_name+"/LoanAgreement/")
if not os.path.exists("clients/" + client_name+"/MortgageBond/"):
os.makedirs("clients/" + client_name+"/MortgageBond/")
if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):
os.makedirs("clients/" + client_name+"/CertificateOfBalance/")
class SecondWindow(Screen):
client_name_label = StringProperty()
def label_name(self):
select_screen = self.manager.get_screen("First")
client_name_label = select_screen.ids.client_name.text
print(client_name_label)
class WindowManager(ScreenManager):
pass
#Designate our .kv design file
#kv = Builder.load_file('law.kv')
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
return Builder.load_file('law.kv')
我的 .kv 文件是
WindowManager:
FirstWindow:
SecondWindow:
<FirstWindow>:
name: "First"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDCard:
size_hint: None, None
size: "400", "150"
padding: 10
pos_hint: {"center_x": .5, "center_y": .5}
orientation: "vertical"
MDTextField:
id: client_name
padding: 20, 20, 50, 20
hint_text: "Type a client name"
helper_text: "This will create a file for the client"
#mode: "rectangle"
size_hint_x: None
width: 350
helper_text_mode: "on_focus"
pos_hint: {"center_x": 0.5, "center_y": 1.0}
on_text_validate: root.press()
on_text_validate: app.root.current = "Second"
MDRaisedButton:
text: "Create"
pos_hint: {"center_x": .8}
#md_bg_color: app.theme_cls.primary_light
on_release:
root.press()
app.root.transition.direction = 'left'
app.root.current = "Second"
root.manager.current_screen.label_name()
<SecondWindow>:
name: "Second"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDLabel:
id: client_label
text: root.client_name_label
halign: "center"
background_color: (1, 1, 1, 1)
pos_hint: {"center_x": .5, "center_y": 0.9}
为了从任何地方访问 SecondWindow 或 FirstWindow,请在您的 .kv
文件中尝试以下操作:
- 为每个屏幕添加
id
引用:
WindowManager:
FirstWindow:
id: screen1
SecondWindow:
id: screen2
- 在您的构建方法中引用根目录:
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
self.root = Builder.load_file('law.kv')
return self.root
现在您可以从任何地方访问您的 Windows:
App.get_running_app().root.ids.screen1 #To acces FirstWindow
App.get_running_app().root.ids.screen2 #To acces SecondWindow
最后,要从 .py
文件修改 client_label
的文本:
App.get_running_app().root.ids.screen2.name = 'Changed!'
基于上述答案只是为了扩展我粘贴了有效的完整解决方案: py
from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os
#Define our different Screens
class FirstWindow(Screen):
def press(self):
client_name = self.ids.client_name.text
print(client_name)
#test()
if client_name == '':
pass
else:
if not os.path.exists("clients/" + client_name):
os.makedirs("clients/" + client_name)
if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
os.makedirs("clients/" + client_name+"/LoanAgreement/")
if not os.path.exists("clients/" + client_name+"/MortgageBond/"):
os.makedirs("clients/" + client_name+"/MortgageBond/")
if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):
os.makedirs("clients/" + client_name+"/CertificateOfBalance/")
MDApp.get_running_app().root.ids.screen2.ids.client_label.text = self.ids.client_name.text # This updates screen2 label
class SecondWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
#Designate our .kv design file
#kv = Builder.load_file('law.kv')
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Green"
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_hue = "700"
self.root = Builder.load_file('law.kv')
return self.root
if __name__ == '__main__':
MainApp().run()
kv 文件
WindowManager:
FirstWindow:
id: scrren1
SecondWindow:
id: screen2
<FirstWindow>:
name: "First"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDCard:
size_hint: None, None
size: "400", "150"
padding: 10
pos_hint: {"center_x": .5, "center_y": .5}
orientation: "vertical"
MDTextField:
id: client_name
padding: 20, 20, 50, 20
hint_text: "Type a client name"
helper_text: "This will create a file for the client"
#mode: "rectangle"
size_hint_x: None
width: 350
helper_text_mode: "on_focus"
pos_hint: {"center_x": 0.5, "center_y": 1.0}
on_text_validate: root.press()
on_text_validate: app.root.current = "Second"
MDRaisedButton:
text: "Create"
pos_hint: {"center_x": .8}
#md_bg_color: app.theme_cls.primary_light
on_release:
root.press() # this function will update screen 2s label
app.root.transition.direction = 'left'
app.root.current = "Second"
<SecondWindow>:
name: "Second"
canvas.before:
Color:
rgba: (202/255, 231/255,193/255,0.4)
Rectangle:
pos: self.pos
size: self.size
MDLabel:
id: client_label
text: '' # This will change when the previous screens button is pressed
halign: "center"
background_color: (1, 1, 1, 1)
pos_hint: {"center_x": .5, "center_y": 0.9}