【问题标题】:how to pass info from one widget to another in kv kivy如何在 kv kivy 中将信息从一个小部件传递到另一个小部件
【发布时间】:2017-09-14 06:36:15
【问题描述】:

我想在按下按钮时设置标签的文本,问题是它们是单独的屏幕,因此在 kv 文件中的单独小部件中。我必须更改的代码是:

<ScreenOne>:
    BoxLayout:
        TextInput:
            id: player_name

        Button:
            text: "Continue"
            on_release:
                root.manager.current = "screen2"
                root.ids.final_playername.text=player_name.text
<ScreenTwo>:
    GridLayout:
            Label:
                text: "Player"
                id: final_playername

我从中得到的错误是:

Traceback (most recent call last):
   File "C:\Users\Rayne\Desktop\python exp\noughts and crosses kivy sm\nandx.py", line 36, in <module>
     nandxApp().run()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\app.py", line 828, in run
     runTouchApp()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\core\window\window_sdl2.py", line 663, in mainloop
     self._mainloop()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop
     EventLoop.idle()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\base.py", line 342, in idle
     self.dispatch_input()
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\base.py", line 327, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\base.py", line 293, in post_dispatch_input
     wid.dispatch('on_touch_up', me)
   File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8191)
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up
     self.dispatch('on_release')
   File "kivy\_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8146)
   File "kivy\_event.pyx", line 1225, in kivy._event.EventObservers.dispatch (kivy\_event.c:14035)
   File "kivy\_event.pyx", line 1109, in kivy._event.EventObservers._dispatch (kivy\_event.c:12816)
   File "C:\Users\Rayne\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "C:\Users\Rayne\Desktop\python exp\noughts and crosses kivy sm\nandx.kv", line 51, in <module>
     root.ids.final_playername.text=player_name.text
   File "kivy\properties.pyx", line 839, in kivy.properties.ObservableDict.__getattr__ (kivy\properties.c:12654)
 AttributeError: 'super' object has no attribute '__getattr__'

在 .py 文件中,我有最少的屏幕类,我试图在建议下保持简单,并在 kv 文件中完成所有操作。任何人都可以帮助新手 python 学习者进行设置吗?谢谢

【问题讨论】:

    标签: python widget kivy


    【解决方案1】:

    详情请参考下面的sn-p和示例。

    片段

    Button:
        size_hint: (.2, .08)
        text: "Continue"
        on_release:
            root.manager.ids.screen_two.ids.final_playername.text = player_name.text
            root.manager.current = "screen2"
    

    示例

    nandxApp.py

    ​​>
    from kivy.app import App
    from kivy.uix.widget import Widget
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.config import Config
    
    Config.set("graphics", "width", "400")
    Config.set("graphics", "height", "570")
    Config.set("graphics", "borderless", "0")
    Config.set("graphics", "resizable", "0")
    Config.set("kivy", "window_icon", "nyc.ico")
    
    
    class Manager(ScreenManager):
        pass
    
    
    class ScreenOne(Screen, Widget):
        pass
    
    
    class ScreenTwo(Screen, Widget):
        pass
    
    
    class ScreenThree(Screen):
        pass
    
    
    class nandxApp(App):
        def build(self):
            self.title = "Noughts and Crosses"
            return Manager()
    
    
    if __name__ == "__main__":
        nandxApp().run()
    

    nandx.kv

    #:kivy 1.10.0
    
    <Manager>:
        ScreenOne:
            id: screen_one
    
        ScreenTwo:
            id: screen_two
    
        ScreenThree:
            id: screen_three
    
    <ScreenOne>:
        name: "screen1"
        GridLayout:
            size_hint: (.5, .5)
            pos_hint: {"center_x":0.5,"center_y":0.6}
            rows: 3
            padding: 20
    
            Label:
                size_hint: (.2, .2)
                text: "Please enter\nyour name:"
                font_size: 30
                halign: 'center'
                valign: 'middle'
    
            TextInput:
                size_hint: (.2, .06)
                cursor_blink: True
                font_size: 20
                multiline: 0
                id: player_name
    
            Button:
                size_hint: (.2, .08)
                text: "Continue"
                on_release:
                    root.manager.ids.screen_two.ids.final_playername.text = player_name.text
                    root.manager.current = "screen2"
    
    <ScreenTwo>:
        name: "screen2"
        GridLayout:
            cols: 3
            size: root.size
            spacing: 10
            padding: 10
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("TopLeft")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("TopMiddle")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("TopRight")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("CenterLeft")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("CenterMiddle")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("CenterRight")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("BottomLeft")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("BottomMiddle")
    
            Button:
                background_normal: ("blank.png")
                # on_release: root.methodforbuttonpress ("BottomRight")
    
            Button:
                background_normal: ("x.png")
    
            GridLayout:
                rows: 2
    
                Label:
                    text: "top label"
    
                Label:
                    text: "bottom label"
    
            Button:
                background_normal: ("circle.png")
    
            GridLayout:
                rows: 2
    
                Label:
                    text: "Player"
                    id: final_playername
    
                Label:
                    text: "Score:"
    
            Label:
                text: ""
    
            GridLayout:
                rows: 2
    
                Label:
                    text: "Computer"
    
                Label:
                    text: "Score:"
    
    
    <ScreenThree>:
        name: "screen3"
    

    输出

    【讨论】:

    • 您能解释一下问题出在哪里以及您是如何在代码中解决问题的吗?此外,在我看来,您发布的代码比需要的大,因此更难找到修复的根源。也许您可以稍微编辑一下,或者真的是所有代码都需要吗?
    • 非常感谢 ikolim,你完美地解决了我的问题,我显然把事情复杂化了。我想你一直在阅读我以前的帖子来获取所有代码,因为我这次尝试发布尽可能少的代码。再次感谢!
    猜你喜欢
    • 2020-02-22
    • 2020-08-08
    • 2020-08-20
    • 2020-09-22
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多