【发布时间】: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()
那也没用。
可能的解决方法
-
说实话,旋转屏幕对我的应用来说并不是那么有用,所以如果我只是禁用屏幕旋转也不会那么糟糕。但是,我无法在文档中找到这样做的好方法。你知道我会怎么做吗?
-
将小部件绑定到
on_pos事件 - 或类似的东西。比如:
class CustomWidget:
def reposition_widgets():
# Code here
on_pos = reposition_widgets
这样做的问题是小部件移动了很多,这意味着函数被调用了很多 - 导致其他地方出现问题。
如果您想查看更多代码,请告诉我。我有超过 1000 行分布在几个文件中,并且觉得仅复制和粘贴不会特别有用。
【问题讨论】:
-
我从未使用过 kivy,但请尝试
Window.on_rotate(app.reposition_widgets)注意没有括号。您调用了reposition_widgets而不是将其作为回调传递。 -
感谢您的建议!我刚刚尝试了您的建议,不幸的是它没有奏效
-
这个骗子看起来很有希望,尽管它只是暗示了一个答案。 @JacobStrauss,如果由于受骗而使其正常工作,则可以自行回答,然后将原件标记为受骗者。