【问题标题】:Python & Kivy: fetching value from another screen to set button on_release valuePython & Kivy:从另一个屏幕获取值以设置按钮 on_release 值
【发布时间】:2021-01-07 09:41:50
【问题描述】:

好的,所以我的目标是,当您按下按钮让我们说“anotherScreen”时,我想被发送到“Screen 0”。在这里,根据从 SQLite 数据库中获取的 0 或 1 值,屏幕上的按钮“btn”会将您发送到 screen1(如果值为 0)或如果值不是 0 (1) 则发送到 screen2。然而,这会产生一些错误。

这里有一些代码可以更好地解释它:

pythonfile.py

import sql_server_file as app_users
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.app import App

class screen0(Screen):
    def __init__(self):
        self.sql_cursor = app_users.AppUsers()
        self.user_id = self.manager.get_screen("anotherScreen").user_id   # <---- This gives 
                                                                      # me an NoneType Error

        self.value = self.sql_cursor.fetch_ids100_done_status(self.user_id)
        if(self.value == 0):
            self.ids["btn"].on_release = "app.root.current = 'screen1'" # <---- This is 
                                          # syntactically wrong, however, how can I do this?

        else:
            self.ids["btn"].on_release = "app.root.current = 'screen2'" # <-- See above

class screen1(Screen):
    pass
class screen2(screen):
    pass
class anotherScreen(Screen):
    def __init__(self):
        self.user_id = 0

class WindowManager(ScreenManager):
    pass

class ReturnClass(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(anotherScreen())
        sm.add_widget(screen0())
        sm.add_widget(screen1())
        sm.add_widget(screen2())
        return sm

if __name__ == '__main__':
    ReturnClass().run()

所以,当输入“anotherScreen”之后的屏幕时,我需要它“自动”运行。

出现错误:

AttributeError: 'NoneType' object has no attribute 'get_screen'

kivy 文件可能如下所示:

kivyfile.kv

WindowManager:
    anotherScreen:
    screen0:
    screen1:
    screen2:

<anotherScreen>:
    Button:
        text: "get to screen0"
        on_release:
            app.root.current = "screen0"

<screen0>:
    Button:
        text: "Get to either screen1 or screen2 depending on value in sqlite-database"

<screen1>:
    Label:
        text: "Screen1"

<screen2>:
    Label:
        text: "Screen2"

【问题讨论】:

    标签: python sqlite kivy


    【解决方案1】:

    screen0__init__() 方法在分配给ScreenManager 之前被调用,所以self.managerNone。这会导致您看到的错误。解决方法是将该代码移至分配ScreenManager 后调用的不同方法。一个不错的选择是在进入屏幕时自动调用的on_enter() 方法。

    那么screen0类可以是:

    class screen0(Screen):
        # no __init__() method needed
    
        def goto_screen1(self):   # go to screen1
            self.manager.current = 'screen1'
    
        def goto_screen2(self):   # go to screen2
            self.manager.current = 'screen2'
    
        def on_enter(self, *args)::   # the new method
            self.sql_cursor = app_users.AppUsers()
            self.user_id = self.manager.get_screen("anotherScreen").user_id
    
            self.value = self.sql_cursor.fetch_ids100_done_status(self.user_id)
            if(self.value == 0):
                self.ids["btn"].on_release = self.goto_screen1
    
            else:
                self.ids["btn"].on_release = self.goto_screen2
    

    请注意,Screen 类应该分配有 name

    另外,kv 中的行:

    WindowManager:
        anotherScreen:
        screen0:
        screen1:
        screen2:
    

    是多余的(因为您在 build() 方法中构建了相同的小部件树),并且可以删除。

    【讨论】:

    • 非常感谢,约翰!是的,抱歉,我刚刚写了一个问题的回顾,忘记了 kv 文件中的名称。不知道那些台词是多余的,刚开始学kivy!这非常有帮助,感谢您的回答,希望您度过愉快的一天!
    • 用更好的解决方案记下我编辑的答案。
    • 嗯,所以on_enter方法是自动调用的?
    • 没关系,我在 kivy 文档中找到了答案。答案显然是肯定的!非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2018-11-14
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2023-04-05
    相关资源
    最近更新 更多