首页 > 解决方案 > Kivy 中小部件的位移

问题描述

使用 Kivy,我正在尝试编写一个显示绘图和按钮的简单应用程序。我有以下代码,但问题是我无法控制我的 kv 文件中图形的大小和位置。因此,我在 Kivy 左下角的默认位置有一个小图,如下所示。我确定我在这里做了一些愚蠢的事情,但不知道是什么?如果有人可以提供帮助,我将不胜感激。

在此处输入图像描述

这是代码:

# Imports
import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
import matplotlib.pyplot as plt
from kivy.app import App
from kivy.app import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.core.window import Window

class Graph(Widget):
    def __init__(self, **kwargs):
        super(Graph, self).__init__(**kwargs)
        layout = FloatLayout()
        plt.plot([1, 2, 3], [1, 2, 3])
        figure = plt.gcf()
        self.plot = FigureCanvasKivyAgg(figure=figure)
        layout.add_widget(self.plot)
        self.add_widget(layout)


class Interface(FloatLayout):
    pass


class TestApp(App):

    def build(self):
        Window.clearcolor = (1, 1, 1, 1)
        return Interface()

if __name__ in ('__main__'):
    TestApp().run()

以及以下 kv 设置:

Interface:

<Interface>:
    padding: 10
    spacing: 10


    Button:
        text: "Open"
        size_hint_x: .15
        size_hint_y: .05
        pos_hint: {'x': 0.05, 'top': .55}

    Graph:
        size_hint_x: .5
        size_hint_y: .5
        pos_hint:{"x":0.5,"y":.5}

编辑:

将 Graph 更改为 FloatLayout 的子类,如下所示:

class Graph(FloatLayout):

def __init__(self, **kwargs):
    super(Graph, self).__init__(**kwargs)

    layout = FloatLayout()
    plt.plot([1, 2, 3], [1, 2, 3])
    figure = plt.gcf()
    self.plot = FigureCanvasKivyAgg(figure=figure)
    layout.add_widget(self.plot)
    self.add_widget(layout)

启用更改图形的大小(FloatLayout)。但是,图形(FloatLayout)的位置不能改变。

在此处输入图像描述

标签: pythonkivykivy-language

解决方案


__init__您在of中创建的布局Graph具有 position(0, 0)和 size (100, 100),因为这些是默认值,没有任何东西告诉它去其他任何地方。当你添加self.plot时,它也有这些参数,因为布局让子填充自己。

一个直接的解决方法是让你的Graph子类成为一个类似的布局BoxLayout,在这种情况下,它的子类将自动被放置来填充它。


推荐阅读