我正在尝试使用Kivy创建GUI。但是,我无法解决某些格式问题。 这是我的KV文件的精简版:
BoxLayout:
MainCanvas:
size_hint: 1,1
size: (root.width,root.height*.9)
DoubleEllipseWidget:
ActionBar:
id: _action
size_hint: 1,0.1
size: (root.width,root.height*.1)
pos_hint: {'bottom':1}
ActionView:
use_separator: True
ActionPrevious:
title: 'Test App:'
with_previous: False
ActionOverflow:
disabled: True
ActionButton:
important: True
text: 'Button 1'
#on_release: some_function
ActionButton:
text: 'Button 2'
#on_release: some_function
ActionButton:
text: 'Button 3'
#on_release: some_function
<DoubleEllipseWidget>
size: [200, 200]
canvas:
Color:
rgba: 0, 0, 0, 1
Ellipse
size: [198, 198]
pos: [600-200-100, 800-200-100]
Color:
rgba: 1, 1, 1, 1
Ellipse
size: [200, 200]
pos: [600-200-100, 800-200-100]
TextInput:
on_parent:self.focus = True
text: 'center of circle'
background_color: (0,0,0,0)
foreground_color: (0,0,0,1)
我要达到的目标很容易解释。
基本上,应该有一个菜单栏沿着屏幕窗口水平运行(总高度的10%和宽度的100%)。我相信我已经做到了。
剩下的95%的高度应该是主画布-我相信我也已经做到了。
最后一部分是将一个特定的小部件放置在主画布的中央。这是我遇到的麻烦,希望能有所帮助。
我需要居中的小部件由两个圆组成(一个圆位于另一个圆的顶部,一个圆稍小于另一个圆)。然后,在最上方的圆圈顶部应该是TextInput。
答案 0 :(得分:0)
在听取了这个社区的建议之后,我剥离了所有逻辑,直到只剩下基础知识(类定义和布局),并且仍然遇到问题。
但是,我现在知道我认为可能不是布局问题。 Kivy错误报告最近于2018年11月被评论(TextInput焦点问题#3863),表明存在无法解释的实例,其中textinput可能失去焦点。以下是建议的解决方法,它也对我有用。感谢那些试图帮助我的人。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
Builder.load_string('''
<Base>:
Button:
text: 'Press for Popup'
on_press: root.edit_text()
<TextInputX>
id: texter
keyboard_mode: 'managed'
is_focusable: True
focus: True
keyboard_on_key_down:
texter.show_keyboard()
''')
class Base(BoxLayout):
def __init__(self, **kwargs):
super(Base, self).__init__(**kwargs)
def edit_text(self, *args):
self.clear_widgets()
content = TextInputX()
# content.focus = True
popup = Popup(content=content)
popup.open()
class TextInputX(TextInput):
def __init__(self, **kwargs):
super(TextInputX, self).__init__(**kwargs)
# self.focus = True
class SampleApp(App):
def build(self):
return Base()
if __name__ == '__main__':
SampleApp().run()