我知道以前一般都回答过类似的问题。我已经阅读了全部。我已经尝试了所有。对于我的特殊情况,似乎没有任何作用。
我正在使用python 3进行kivy处理。不确定是否是这个原因(也许先前的答案仅适用于python 2?)。
我只想将来自screen1_textinput(screen1_textinput.text)的文本输入和来自screen1_textinput2(screen1_textinput2.text)的文本传递,[最后一个是来自屏幕1的滑块的输入]传递给screen2_textinput的文本输入(screen2_textinput.text)。
下面的完整代码可简化我的应用程序
## IMPORT THE DIFFERENT PACKAGES AND PROGRAMS NEEDED FOR THE APP TO WORK
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition, SwapTransition, FadeTransition, WipeTransition, FallOutTransition, RiseInTransition
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
## THE BUILDER HAS THE CODE THAT DEFINES THE APPEARANCE OF THE APP. IT IS THE KIVY CODE
Builder.load_string("""
############################################################SCREEN 1########################################
<Screen1>:
RelativeLayout: # RelativeLayout allows the elements of a screen to be positioned relatively to the position of the screen
Label: # Label is just text
id: screen1_label # Identifier
text: 'This screen just shows a TextInput and a slider' # Text that appears in the label
pos_hint: {'x': 0.5, 'y': 0.9} # Position of the Label in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.15, 0.05) # Size of the Label
font_size: (screen1_label.width + screen1_label.height) / 6 # Size of the font relative to the size of the Label
bold: True # Bold face
TextInput: # TextInput allows the user to enter text into a box
id: screen1_textinput # Identifier
text: '' # The initial text in the text box, nothing in this case
hint_text: 'This is a TextInput. Just enter some text' # The hint text guides the user to what input is expected
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.05, 'y': 0.8} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.5, 0.05) # Size of the InputText in relation to the screen
font_size: (screen1_textinput.width + screen1_textinput.height) / 32 # Size of the font relative to the size of the TextInput
on_text: root.manager.get_screen('screen2').screen2_textinput.text = screen1_textinput.text
Slider:
id: screen1_slider # Identifier
min: 0 # Minimum value allowed for the slider
max: 100 # Maximum value allowed for the slider
value: 50 # Initial value
step: 1 # Step size
orientation: 'vertical' # Orientation of the slider
pos_hint: {'x': 0.3, 'y': 0.20} # Location of the slider in the screen (relative to the screen size)
size_hint: (0.05, 0.25) # Size of the slider relative to the size of the screen
TextInput: # TextInput allows the user to enter text into a box
id: screen1_textinput2 # Identifier
text: str(int(screen1_slider.value)) # The initial text in the text box, the value of the slider in this case
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.5, 'y': 0.4} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.1, 0.05) # Size of the InputText in relation to the screen
font_size: (screen1_textinput2.width + screen1_textinput2.height) / 10 # Size of the font relative to the size of the TextInput
Button:
id: screen1_buttontoscreen2 # Identifier
text: 'Move to screen 2' # Text in the button
pos_hint: {'x': 0.18, 'y': 0.02} # Position of the Button in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.2, 0.05) # Size of the Button in relation to the screen
background_color: (1, 1, 1, 1) # The background of the button
color: (0, 0, 1, 1) # The color of the text of the Button
font_size: (screen1_buttontoscreen2.width + screen1_buttontoscreen2.height) / 12 # Size of the font relative to the size of the Button
on_release:
root.manager.current = 'screen2' # Switch to screen 2 on release of the Button
############################################################SCREEN 2########################################
<Screen2>:
screen2_textinput: screen2_textinput
RelativeLayout: # RelativeLayout allows the elements of a screen to be positioned relatively to the position of the screen
Label: # Label is just text
id: screen2_label # Identifier
text: 'This screen just collects the inputs from Screen 1' # Text that appears in the label
pos_hint: {'x': 0.5, 'y': 0.9} # Position of the Label in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.15, 0.05) # Size of the Label
font_size: (screen2_label.width + screen2_label.height) / 6 # Size of the font relative to the size of the Label
bold: True # Bold face
TextInput: # TextInput allows the user to enter text into a box
id: screen2_textinput # Identifier
text: ''
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.5, 'y': 0.45} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.3, 0.05) # Size of the InputText in relation to the screen
font_size: (screen2_textinput.width + screen2_textinput.height) / 10 # Size of the font relative to the size of the TextInput
Button:
id: screen2_buttontoscreen1 # Identifier
text: 'Move to screen 1' # Text in the button
pos_hint: {'x': 0.18, 'y': 0.02} # Position of the Button in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.2, 0.05) # Size of the Button in relation to the screen
background_color: (1, 1, 1, 1) # The background of the button
color: (0, 0, 1, 1) # The color of the text of the Button
font_size: (screen2_buttontoscreen1.width + screen2_buttontoscreen1.height) / 12 # Size of the font relative to the size of the Button
on_release:
root.manager.current = 'screen1' # Switch to screen 1 on release of the Button
""")
## THIS PART IS THE PYTHON CODE
class Screen1(Screen):
pass
class Screen2(Screen):
def passvariables(self):
self.screen2_textinput.text = self.ids.screen1_textinput.text
pass
class whAppever(App):
def build(self):
sm = ScreenManager(transition = FallOutTransition())
sm.add_widget(Screen1(name = 'screen1'))
sm.add_widget(Screen2(name = 'screen2'))
return sm
if __name__=='__main__':
whAppever().run()
我的问题特别是如何将值从kivy语言传递给python语言以及如何从python语言传递给kivy语言,并始终更新值。在查看并尝试了所有先前的答案之后,我发现传递值的一种好方法是在屏幕2中使用它:
class Screen2(Screen):
def passvariables(self):
self.screen2_textinput.text = self.ids.screen1_textinput.text
pass
我的想法是,使用此代码,我使值screen2_textinput.text等于值screen1_textinput.text
此代码运行,并且该应用已上传且没有错误。但是,当我更新screen1_textinput.text的文本时,什么也没有发生(在screen2_textinput的文本中没有更新)。根据对类似问题的先前回答,这应该有效,但事实并非如此。
我发现的唯一可能的解决方法是在猕猴桃屏幕screen1_textinput中使用
on_text: root.manager.get_screen('screen2').screen2_textinput.text = screen1_textinput.text
只是将在screen1_textinput输入的文本传递给screen2_textinput,但这不是我想要的。我想将screen1_textinput(screen1_textinput.text)的文本值传递给python代码,以便可以对其进行操作,将screen1_textinput2(screen1_textinput2.text)的文本值传递给python代码,以便可以在python代码中进行操作,将它们组合在一起(使用python语言比使用kivy语言要容易得多),然后将所得的字符串传递回screen2_textinput(screen2_textinput.text)。并更新所有值。
我认为这应该很简单,但是对此有数十页内容,并且似乎没有任何工作可以根据我的需要更新值。
任何帮助表示赞赏。我已经阅读并尝试过类似问题的先前答案。我没有想做的事。
谢谢
答案 0 :(得分:1)
以下代码不起作用,因为self
指向Screen2,并且ids.screen1
在self.ids
中不存在。 print(self.ids)
将显示Screen2下kv文件中定义的所有 ids 。
self.screen2_textinput.text = self.ids.screen1_textinput.text
有关详细信息,请参阅示例。
passvariables(self)
替换为on_enter(self, *args)
self.ids.screen1_textinput.text
替换为self.manager.ids.screen1.ids.screen1_textinput.text
return sm
替换为return ScreenManagement()
## IMPORT THE DIFFERENT PACKAGES AND PROGRAMS NEEDED FOR THE APP TO WORK
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition, SwapTransition, FadeTransition, WipeTransition, FallOutTransition, RiseInTransition
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
## THE BUILDER HAS THE CODE THAT DEFINES THE APPEARANCE OF THE APP. IT IS THE KIVY CODE
Builder.load_string("""
#:import FallOutTransition kivy.uix.screenmanager.FallOutTransition
<ScreenManagement>:
transition: FallOutTransition()
Screen1:
id: screen1
name: 'screen1'
Screen2:
id: screen2
name: 'screen2'
############################################################SCREEN 1########################################
<Screen1>:
RelativeLayout: # RelativeLayout allows the elements of a screen to be positioned relatively to the position of the screen
Label: # Label is just text
id: screen1_label # Identifier
text: 'This screen just shows a TextInput and a slider' # Text that appears in the label
pos_hint: {'x': 0.5, 'y': 0.9} # Position of the Label in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.15, 0.05) # Size of the Label
font_size: (screen1_label.width + screen1_label.height) / 6 # Size of the font relative to the size of the Label
bold: True # Bold face
TextInput: # TextInput allows the user to enter text into a box
id: screen1_textinput # Identifier
text: '' # The initial text in the text box, nothing in this case
hint_text: 'This is a TextInput. Just enter some text' # The hint text guides the user to what input is expected
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.05, 'y': 0.8} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.5, 0.05) # Size of the InputText in relation to the screen
font_size: (screen1_textinput.width + screen1_textinput.height) / 32 # Size of the font relative to the size of the TextInput
Slider:
id: screen1_slider # Identifier
min: 0 # Minimum value allowed for the slider
max: 100 # Maximum value allowed for the slider
value: 50 # Initial value
step: 1 # Step size
orientation: 'vertical' # Orientation of the slider
pos_hint: {'x': 0.3, 'y': 0.20} # Location of the slider in the screen (relative to the screen size)
size_hint: (0.05, 0.25) # Size of the slider relative to the size of the screen
TextInput: # TextInput allows the user to enter text into a box
id: screen1_textinput2 # Identifier
text: str(int(screen1_slider.value)) # The initial text in the text box, the value of the slider in this case
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.5, 'y': 0.4} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.1, 0.05) # Size of the InputText in relation to the screen
font_size: (screen1_textinput2.width + screen1_textinput2.height) / 10 # Size of the font relative to the size of the TextInput
Button:
id: screen1_buttontoscreen2 # Identifier
text: 'Move to screen 2' # Text in the button
pos_hint: {'x': 0.18, 'y': 0.02} # Position of the Button in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.2, 0.05) # Size of the Button in relation to the screen
background_color: (1, 1, 1, 1) # The background of the button
color: (0, 0, 1, 1) # The color of the text of the Button
font_size: (screen1_buttontoscreen2.width + screen1_buttontoscreen2.height) / 12 # Size of the font relative to the size of the Button
on_release:
root.manager.current = 'screen2' # Switch to screen 2 on release of the Button
############################################################SCREEN 2########################################
<Screen2>:
screen2_textinput: screen2_textinput
RelativeLayout: # RelativeLayout allows the elements of a screen to be positioned relatively to the position of the screen
Label: # Label is just text
id: screen2_label # Identifier
text: 'This screen just collects the inputs from Screen 1' # Text that appears in the label
pos_hint: {'x': 0.5, 'y': 0.9} # Position of the Label in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.15, 0.05) # Size of the Label
font_size: (screen2_label.width + screen2_label.height) / 6 # Size of the font relative to the size of the Label
bold: True # Bold face
TextInput: # TextInput allows the user to enter text into a box
id: screen2_textinput # Identifier
text: ''
background_color: (1, 0, 0, 1) # The background of the TextInput
foreground_color: (1, 1, 1, 1) # The color of the text
pos_hint: {'x': 0.5, 'y': 0.45} # Position of the InputText in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.3, 0.05) # Size of the InputText in relation to the screen
font_size: (screen2_textinput.width + screen2_textinput.height) / 10 # Size of the font relative to the size of the TextInput
Button:
id: screen2_buttontoscreen1 # Identifier
text: 'Move to screen 1' # Text in the button
pos_hint: {'x': 0.18, 'y': 0.02} # Position of the Button in relation to the screen (coordinates (0,0) are lower left)
size_hint: (0.2, 0.05) # Size of the Button in relation to the screen
background_color: (1, 1, 1, 1) # The background of the button
color: (0, 0, 1, 1) # The color of the text of the Button
font_size: (screen2_buttontoscreen1.width + screen2_buttontoscreen1.height) / 12 # Size of the font relative to the size of the Button
on_release:
root.manager.current = 'screen1' # Switch to screen 1 on release of the Button
""")
## THIS PART IS THE PYTHON CODE
class Screen1(Screen):
pass
class Screen2(Screen):
def on_enter(self, *args):
self.screen2_textinput.text = self.manager.ids.screen1.ids.screen1_textinput.text
class ScreenManagement(ScreenManager):
pass
class whAppever(App):
def build(self):
return ScreenManagement()
if __name__ == '__main__':
whAppever().run()