使用 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()
我得到两个TextInput
s,一个在另一个之上。当我单击顶部的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 中重叠文本输入的主要内容,如果未能解决你的问题,请参考以下文章