当我在Kivy的另一个屏幕上按下按钮时,如何更改屏幕中的标签文本

问题描述:

我是Kivy的新手,所以我有一个问题,我想在Kivy中开发两个屏幕,第一个是关于输入用户细节和密码(此时不验证),然后第二个屏幕显示用户名(在前一个屏幕输入),并显示用户名和其他小部件。 其基本思想是获取用户表单userlogin屏幕的值并将其显示到另一个屏幕。 这里是我的代码,当我在Kivy的另一个屏幕上按下按钮时,如何更改屏幕中的标签文本

从kivy.app导入应用

from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.properties import StringProperty # @UnresolvedImport 


class LoginScreen(Screen): 
    text = StringProperty() 
    def change_text(self): 
     self.text = '' 
     self.manager.current = 'StocksGUIScreen' 

class StocksGUIScreen(Screen): 
    label_text = StringProperty('') 
    #pass 


class PortfolioUIApp(App): 
    #user_name = StringProperty() 
    pass 

PortfolioUIApp().run() 

这里是我的.kv文件:

ScreenManager: 
    id: screen_manager 
    LoginScreen: 
     id: login_screen 
     name: 'LoginScreen' 
     manager: screen_manager 
    StocksGUIScreen: 
     id: stocks_gui 
     name: 'StocksGUIScreen' 
     manager: screen_manager 
     label_text: login_screen.text 


<LoginScreen>: 
    BoxLayout: 
     orientation: 'vertical' 
     BoxLayout: 
      Label: 
       text: "User Name" 
       size_hint: 0.3,0.2 
       #pos: root.x, root.top-self.height 
       color: 0,1,0,1 

      TextInput: 
       id: user_name 
       size_hint: 0.3,0.2 
       #on_text: root.user_name 

     BoxLayout: 
      Label: 
       text: "Password" 
       size_hint: 0.3,0.2 
      TextInput: 
       id: pass_word 
       password: True 
       size_hint: 0.3,0.2 
     BoxLayout: 
      Button: 
       text: 'Log In' 
       size_hint: 0.3,0.2 
       on_press: 
        #root.manager.current = 'StocksGUIScreen' 
        root.label_text: user_name 
        root.change_text() 
      Button: 
       text: 'Cancel' 
       size_hint: 0.3,0.2 
       on_release: app.stop() 

<StocksGUIScreen>: 
    BoxLayout: 
     orientation: 'vertical' 
     BoxLayout: 
      orientation: 'horizontal' 
      TextInput: 
       size_hint_x: 50 
       id: ticker_search 
      Button: 
       text: "Go" 
       size_hint_x: 25 
       on_press: root.search_stock() 
       id: search_box 
      Label: 
       text: root.label_text 
       size_hint_x: 25 

     BoxLayout: 
      height: "10dp" 
      size_hint_y: 5 
      Label: 
       size_hint_x: .2 
       size_hint_y: .1 
       text: "Advice" 
       color: [1,0,0,1] 
       text_size: self.size 
       halign: 'left' 
       valign: 'top' 
      ScrollView: 
       size: self.size 
       GridLayout: 
        id: layout_content 
        size_hint_y: None 
        cols: 1 
        row_default_height: '20dp' 
        row_force_default: True 
        spacing: 0, 0 
        padding: 0, 0 
        color: [1,0,0,1] 
        Label: 
         text: "Lorem ipsum dolor sit amet"*10 
         id: advice_message 
         text_size: self.size 
         halign: 'left' 
         valign: 'top' 
     BoxLayout: 
      height: "10dp" 
      size_hint_y: 10 
      Label: 
       size_hint_x: .2 
       size_hint_y: .1 
       text: "Graphical Stuff" 
       id: graphical_stuff 
       text_size: self.size 
       halign: 'left' 
       valign: 'top' 
      AsyncImage: 
       source: "abc.png" 
       id: graphical_stuff 
       allow_stretch: True 
       keep_ratio: False 
       pos: 200,300 
       size: root.width*0.5,root.height*0.2 
     BoxLayout: 
      orientation: 'horizontal' 
      Button: 
       text: 'My settings button' 
      Button: 
       text: 'Back to Log in screen' 
       on_press: root.manager.current = 'LoginScreen'     

有什么不对这个代码,任何帮助/指导会高度赞赏plz

如果你想这个设置,你可以在第一个屏幕上设置一个属性。在第二个屏幕中通过ID访问它。

from kivy.app import App 
from kivy.uix.screenmanager import Screen 
from kivy.lang import Builder 
from kivy.properties import StringProperty 

class Screen1(Screen): 
    username = StringProperty("") 

class Screen2(Screen): 
    username = StringProperty("") 


root = Builder.load_string(''' 

<Screen1>: 
    BoxLayout: 
     orientation: "vertical" 
     TextInput: 
      id: username 
     Button: 
      text: "Login" 
      on_release: root.username = username.text; root.manager.current = "screen2" 


<Screen2>: 
    name: "screen2" 
    Label: 
     text: root.username 


ScreenManager: 
    Screen1: 
     id: loginscreen 
    Screen2: 
     username: loginscreen.username 

''') 



class MyApp(App): 
    def build(self): 
     return root 
+0

你是伟大的,它的工作原理,谢谢你, – Mahdi

+0

@Mahdi你很欢迎 – EL3PHANTEN