使用 FloatLayout 在 Kivy 中重叠文本输入

Posted

技术标签:

【中文标题】使用 FloatLayout 在 Kivy 中重叠文本输入【英文标题】:Overlapping TextInputs in Kivy using FloatLayout 【发布时间】:2017-06-17 21:42:15 【问题描述】:

使用此代码:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput


class Main(App):
    def build(self):
        root = FloatLayout(size=(100, 100))
        root.add_widget(TextInput(pos=(0, 0)))
        root.add_widget(TextInput(pos=(50, 50)))
        return root


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

我得到两个TextInputs,一个在另一个之上。当我单击顶部的TextInput(通过单击屏幕中间的某处)时,由于某种原因,焦点转到了较低的TextInput。事实上,我可以专注于顶部TextInput 的唯一方法是完全单击底部TextInput 之外(通过单击屏幕顶部的右侧)。为什么会发生这种情况,我该如何规避?

【问题讨论】:

参考GitHub issue. 【参考方案1】:

您的问题可以通过两种方式解决。Float layout 尊重其子项的 pos_hint 和 size_hint 属性。因此您需要为 textinput 设置 size_hint。

即-

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput


class Main(App):
    def build(self):
        root = FloatLayout(size=(100, 100))
        root.add_widget(TextInput(pos=(0, 0),size_hint=(0.5,0.5)))
        root.add_widget(TextInput(pos=(100, 100),size_hint=(0.5,0.5)))
        return root


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

或者使用boxlayout代替floatlayout

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput


class Main(App):
    def build(self):
        root = BoxLayout(size=(100, 100))
        root.add_widget(TextInput(pos=(0, 0)))
        root.add_widget(TextInput(pos=(50, 50)))
        return root


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

【讨论】:

这两种方法都不适合我。使用size_hint 只是调整TextInput 小部件的大小,并且不会改变在重叠区域中处理焦点的方式。 BoxLayout 只是将一个 TextInput 移动到另一个的一侧(即没有重叠)。 好吧,我明白了。我误解了这个问题。Yr 的担忧是真实的,我觉得这是一个错误。要解决你的问题,您可以尝试使用 focus = True 获取第一个小部件,使用 focus = False 获取第二个并动态更改它以反转,例如focus = False 用于第一个小部件,focus = True 用于第二个小部件。您可以使用 onclick 方法进行操作。

以上是关于使用 FloatLayout 在 Kivy 中重叠文本输入的主要内容,如果未能解决你的问题,请参考以下文章

Kivy,从python文件更改画布的源图片

转发:kivy中的一些widget及其参数~

StringProperty 结构和类 Kivy

Kivy - 使用 .kv

如何在 kivy python 中使用 size_hint 制作标签

在 Kivy 中,如何使用另一个类的关闭按钮关闭弹出窗口?