【问题标题】:How do I call a function when the screen is rotated?屏幕旋转时如何调用函数?
【发布时间】:2020-11-24 23:57:53
【问题描述】:

问题

我正在构建应用程序(使用 Kivy),它将一些自定义小部件呈现到屏幕上。不幸的是,当我运行应用程序的平板电脑旋转时,它们的位置(相对于其他小部件)会发生变化。现在我已经构建了一个重新定位它们的函数,我想在平板电脑旋转时调用这个函数。我该如何实现?

到目前为止我的尝试...

我从 Kivy 文档中看到 Window 类有一个 on_rotate 事件,并尝试以几种不同的方式将其合并到我的程序中。

首先,我尝试在if __name__ == '__main__' 语句之后实现回调。比如:

if __name__ == '__main__':
     app = MainApp()
     Window.on_rotate = lambda: app.reposition_widgets()
     app.run()

那什么也没做。徒劳我也试过:

if __name__ == '__main__':
     app = MainApp()
     Window.on_rotate(app.reposition_widgets)
     app.run()

然后我尝试将小部件绑定到 on_rotate 事件,例如:

class CustomWidget(Widget):
     def __init__(self, **kwargs)
          super().__init__(**kwargs)
          self.bind(on_rotate = self.reposition_widgets)

那什么也没做。也没有:

class CustomWidget(Widget):
     def __init__(self, **kwargs)
          super().__init__(**kwargs)
     
     on_rotate = reposition_widgets

我最后的尝试是在随附的 kv 文件和 Python 文件中创建一个 Window 类,然后从那里指定 on_rotate 事件。比如:

#kv file
Window:
     on_rotate: app.reposition_widgets()

那也没用。

可能的解决方法

  1. 说实话,旋转屏幕对我的应用来说并不是那么有用,所以如果我只是禁用屏幕旋转也不会那么糟糕。但是,我无法在文档中找到这样做的好方法。你知道我会怎么做吗?

  2. 将小部件绑定到on_pos 事件 - 或类似的东西。比如:

class CustomWidget:
     
     def reposition_widgets():
         # Code here

     on_pos = reposition_widgets

这样做的问题是小部件移动了很多,这意味着函数被调用了很多 - 导致其他地方出现问题。


如果您想查看更多代码,请告诉我。我有超过 1000 行分布在几个文件中,并且觉得仅复制和粘贴不会特别有用。

【问题讨论】:

  • 我从未使用过 kivy,但请尝试 Window.on_rotate(app.reposition_widgets) 注意没有括号。您调用了 reposition_widgets 而不是将其作为回调传递。
  • 感谢您的建议!我刚刚尝试了您的建议,不幸的是它没有奏效
  • 这个骗子看起来很有希望,尽管它只是暗示了一个答案。 @JacobStrauss,如果由于受骗而使其正常工作,则可以自行回答,然后将原件标记为受骗者。

标签: python kivy


【解决方案1】:

我能够使用on_size 事件解决此问题。

class CustomWidget(Widget):
    
    def reposition_widgets(self):
        # Reposition logic here

    on_size = reposition_widgets

这实际上工作得很好。我在reposition_widgets 函数中添加了一个附加参数,以区分由于on_size 而重新定位的时间和由于调用它而重新定位的时间(参见下面的示例)。但是,这并不总是必要的。

class CustomWidget(Widget):
    
    def reposition_widgets(self, rotation=False):
        if rotation:
            # When function is called due to on_size
        else:
            # When function is called in code

    on_size = lambda self, *args: self.reposition_widgets(rotation=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多