繁体   English   中英

如何从屏幕实例外部切换 Kivy Python 文件中的屏幕

[英]How to switch screens in Kivy Python file from outside of a screen instance

我正在尝试在 Kivy 应用程序中编写 function 应用程序,该应用程序将处理打开和关闭设备屏幕的背光。 由于我希望这个 function 独立于用户所在的任何屏幕运行,我想从屏幕实例外部调用到“屏幕保护程序”屏幕的转换。 目标是有一个计时器在进入应用程序时开始计数,该应用程序将安排一个 function,它会转动屏幕亮度并将屏幕转换为仅包含一个按钮的屏幕保护程序屏幕(这样当您触摸显示屏唤醒它,它不会触发应用程序的任何按钮)。 当您点击屏保屏幕的按钮时,它将打开显示亮度并返回主页(或返回上一个使用的屏幕,但这是下一个障碍)。

下面是我的代码的精简版本:

os_example.py:

import subprocess
import kivy
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.uix.screenmanager import FadeTransition


# ---- Backlight Setup -----------

backlight_command = "sudo rpi-backlight -b 50"
process = subprocess.Popen(backlight_command.split())

# --------------------------------
 

class HubHome(Screen):
    pass


class Lighting(Screen):
    pass


class Climate(Screen):
    pass


class ScreenSaver(Screen):
    pass


class WindowManager(ScreenManager):
    
    def __init__(self, **kwargs):
        super(WindowManager, self).__init__(**kwargs)

    def switch_to_screensaver(self):
        self.current = "screensaver"



def dimScreen():
    backlight_command = "sudo rpi-backlight -b 20 --duration 0.3"
    process = subprocess.Popen(backlight_command.split())
    print("dimmed")


def sleepScreen(*args):
    backlight_command = "sudo rpi-backlight -b 0"
    process = subprocess.Popen(backlight_command.split())
    App.get_running_app().root.ids.manager.transition = FadeTransition(duration = .3)
    App.get_running_app().root.ids.manager.current = "screensaver"


def brightnessUp():
    backlight_command = "sudo rpi-backlight -b 50"
    process = subprocess.Popen(backlight_command.split())


def on_motion(self, etype, motionevent, **kwargs):
    brightnessUp()
    Clock.unschedule(sleepScreen)
    Clock.schedule_once(sleepScreen, 5)


Window.bind(on_motion=on_motion)

kv = Builder.load_file("so_example.kv")


class HubApp(App):
    def build(self):
        return kv
    

if __name__ == "__main__":
    HubApp().run()

so_example.kv:

#: import SlideTransition kivy.uix.screenmanager.SlideTransition

WindowManager:
    HubHome:
    Lighting:
    Climate:
    ScreenSaver:
        id: screensaver

<Button>:
    font_size: 28
    
<Title@Label>:
    font_size: 36
    height: 100
    size_hint_y: None


<HubHome>:
    name: "hubhome"
    
    GridLayout:
        cols: 1
    
        Title:
            text: "Hub Home"
    
        GridLayout:
            cols: 2
            
            Button:
                text: "Lighting"
                on_release:
                    root.manager.transition.direction = "right"
                    app.root.current = "lighting"

            Button
                text: "Climate"
                on_release:
                    root.manager.transition.direction = "left"
                    app.root.current = "climate"


<Lighting>:
    name: "lighting"
    
    GridLayout:
        cols: 1
    
        Title:
            text: "Lighting"
        
        Button:
            text: "Back"
            on_release:
                app.root.current = "hubhome"
                root.manager.transition.direction = "left"  


<Climate>:
    name: "climate"
    
    GridLayout:
        cols: 1
    
        Title:
            text: "Climate"
        
        Button:
            text: "Back"
            on_release:
                app.root.current = "hubhome"
                root.manager.transition.direction = "right" 
            
            
<ScreenSaver>:
    name: "screensaver"
    
    Button:
        background_color: (0,0,0, 1)
        on_press:
            app.root.transition = SlideTransition(direction = "up")
            root.manager.transition.direction = "up"
            app.root.current = "hubhome"

我尝试在 Python 代码中实例化屏幕管理器,如下所示:

wm = WindowManager()
wm.add_widget(HubHome())
wm.add_widget(Climate())
wm.add_widget(Lighting())
wm.add_widget(ScreenSaver(name='screensaver'))

然后尝试在“sleepScreen”function 中调用以下代码,但没有成功。

wm.current = 'screensaver'

同样,这行代码不断抛出错误:

App.get_running_app().root.ids.manager.current = "screensaver"

错误:

AttributeError: 'super' object has no attribute '__getattr__'

从 Screen 实例中转换屏幕似乎很简单,但我很难在 Screen 实例之外执行它。 如果您有任何建议,请告诉我-谢谢!

您的Approot WidgetScreenManager ( WindowManager ),因此您的sleepScreen()方法只需引用App root属性即可访问WindowManager sleepScreen()方法可以是:

def sleepScreen(*args):
    backlight_command = "sudo rpi-backlight -b 0"
    process = subprocess.Popen(backlight_command.split())
    App.get_running_app().root.transition = FadeTransition(duration=.3)
    App.get_running_app().root.current = "screensaver"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM