【发布时间】:2020-04-29 11:18:57
【问题描述】:
我正在尝试将广告合并到我制作的 Kivy 应用程序中,为此,我希望在 FloatLayout 中有一个类(带有广告)位于我的屏幕顶部,以及应用程序的其余部分在下面,在一个单独的类中。
我试图让它与一些测试代码一起工作(简单的 .py 和 .kv 文件,它有多个屏幕和类并相应地组织)。代码应该有两个浮动布局:一个有文本,另一个有一个按钮,您可以按下它并带您进入下一个屏幕。但是我遇到的问题是我无法正确定位按钮,因为它似乎在左下角缩小了小部件。它应该在文本框旁边。
这是我的 .kv 文件:
WindowManager:
Screen1:
Screen2:
<Screen1>:
name: "screen1"
FloatLayout:
Label:
pos_hint: {'top': 1, "center_x": 0.5}
size_hint: (0.2, 0.5)
font_size: 40
text: "TEXT AT TOP OF SCREEN"
FloatLayout:
TextInput:
pos_hint: {"x": 0.1, "y": 0.05}
size_hint: (0.3, 0.05)
multline:False
GoS:
FloatLayout:
Button:
text: "PRESS TO GO TO SCREEN 2"
pos_hint: {"right": 0.5, "center_y": 0.7}
on_press: widget.goscreen()
<Screen2>:
name: "screen2"
Label:
text: "YOU ARE ON SCREEN TWO"
这里是 .py 文件:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
class Screen1(Screen):
pass
class GoS(Widget):
def goscreen(self):
self.parent.current = "screen2"
class Screen2(Screen):
pass
class WindowManager(ScreenManager):
pass
kv = Builder.load_file("rec_view.kv")
class TestApp(App):
def build(self):
return kv
if __name__ == "__main__":
TestApp().run()
为什么会这样?
另一个小问题是我的按钮不起作用,因为我似乎无法调用正确的类。如果我使用“root.goscreen()”,它就不起作用,因为我的根小部件没有这个功能。这里的正确语法应该是什么?
【问题讨论】:
-
您的
Screen1类包含 3 个孩子(2 个FloatLayouts和一个GoS)。其中每一个都是Screen1的完整大小,因为默认的size_hint是(1,1)。FloatLayout在GoS中的大小将是(100,100),因为GoS不是Layout并且不尊重size_hint。目前尚不清楚您希望最终的 gui 是什么样子,但获得具有顶部、中间和底部部分的 gui 的更好方法可能是使用BoxLayout。另请注意FloatLayout是限制最少的Layout,因此将Label放在FloatLayout中并不意味着它会被绘制在里面。 -
太棒了,谢谢!随意添加这个作为答案,我可以接受它:) 我将我的类 GoS 从小部件更改为 FloatLayout 并修复它。 BoxLayouts 仍然让我有些困惑,但我知道通常容器比浮动更好。还有一个问题,您是否知道我应该调用什么才能调用我的 GoS 课程(最后一点)?
-
如果您在
kv中的GoS:规则中添加id(例如:id: gos),那么您的on_press用于Button可以是on_press: gos.goscreen()。您可以在goscreen()方法中将self.parent.current = "screen2"替换为kv.current = "screen2"。
标签: python kivy kivy-language