gpt4 book ai didi

python - 在kivy中的类(屏幕)之间传递值

转载 作者:行者123 更新时间:2023-12-01 09:18:44 27 4
gpt4 key购买 nike

我知道以前已经回答过一般类似的问题。我已经全部读完了。我都试过了。似乎没有什么适合我的特殊情况。

我正在 kivy 中使用 python 3 工作。不确定这是否是原因(也许之前的答案仅适用于 python 2?)。

我只是想将 screen1_textinput (screen1_textinput.text) 的文本输入和 screen1_textinput2 (screen1_textinput2.text) 的文本输入传递到 screen2_textinput 的文本输入,[最后一个是屏幕 1 的 slider 的输入] (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 的文本没有更新)。根据之前对类似问题的回答,这应该有效,但事实并非如此。

我发现的唯一潜在的解决方法是在 kivy 语言 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)。并更新所有值。

我认为这应该是直截了当的,但是这有几十页,而且似乎没有任何东西可以按我想要的方式工作和更新值。

任何帮助表示赞赏。我已经阅读并尝试过类似问题的先前答案。没有什么能完成我想做的事情。

谢谢

最佳答案

问题与解释

您的应用遇到问题,因为 self 引用了 Screen2,而 self.ids 中不存在 ids.screen1。如果在代码前添加print(self.ids),则会显示Screen2下kv文件中定义的所有ids

片段

 self.screen2_textinput.text = self.ids.screen1_textinput.text

解决方案

详情请参阅示例。

kv 文件

  1. 添加新类 ScreenManagement
  2. 在 ScreenManagement 下添加屏幕 1 和 2
  3. 为屏幕 1 和 2 添加id
  4. 删除 screen1_textinputon_text 事件

Python 文件

  1. passvariables(self) 替换为 on_enter(self, *args)
  2. self.ids.screen1_textinput.text 替换为 self.manager.ids.screen1.ids.screen1_textinput.text
  3. 添加类ScreenManagement
  4. return sm 替换为 return ScreenManagement()
  5. 删除所有对 sm 的引用

示例

main.py
## 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()

输出

Img01 - Kivy entered Img02 - Kivy displayed

关于python - 在kivy中的类(屏幕)之间传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50991371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com