在基维中的类(屏幕)之间传递值

时间:2018-06-22 15:37:56

标签: python kivy

我知道以前一般都回答过类似的问题。我已经阅读了全部。我已经尝试了所有。对于我的特殊情况,似乎没有任何作用。

我正在使用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)。并更新所有值。

我认为这应该很简单,但是对此有数十页内容,并且似乎没有任何工作可以根据我的需要更新值。

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

谢谢

1 个答案:

答案 0 :(得分:1)

问题与解释

以下代码不起作用,因为self指向Screen2,并且ids.screen1self.ids中不存在。 print(self.ids)将显示Screen2下kv文件中定义的所有 ids

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

选择

有关详细信息,请参阅示例。

kv文件

  1. 添加新的类ScreenManagement
  2. 在“屏幕管理”下添加屏幕1和2
  3. 为屏幕1和2添加 id
  4. 删除 screen1_textinput
  5. on_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
  6. 的引用

示例

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