【问题标题】:Overlapping TextInputs in Kivy using FloatLayout使用 FloatLayout 在 Kivy 中重叠文本输入
【发布时间】: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 之外(通过单击屏幕顶部的右侧)。为什么会发生这种情况,我该如何规避?

【问题讨论】:

标签: python user-interface kivy textinput


【解决方案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 方法进行操作。
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多