Смещение виджета в Кивах - PullRequest
0 голосов
/ 04 мая 2018

Используя Kivy, я пытаюсь написать простое приложение, которое показывает график и кнопку. У меня есть следующий код, но проблема в том, что я не могу контролировать размер и положение графика в моем файле kv. Таким образом, у меня есть небольшой график в положении Kivy по умолчанию в левом нижнем углу, как показано ниже. Я уверен, что я делаю что-то глупое здесь, но не могу понять, что? Я ценю, если кто-нибудь может помочь с этим.

enter image description here

Вот код:

# 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}

Edit:

Изменение 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) не может измениться.

enter image description here

1 Ответ

0 голосов
/ 04 мая 2018

Макет, который вы создаете в __init__ из Graph, имеет позицию (0, 0) и размер (100, 100), потому что это значения по умолчанию, и ничто не говорит о том, что оно должно идти куда-либо еще. Когда вы добавляете self.plot, у него также есть эти параметры, потому что макет заставляет дочерний объект заполняться сам.

Немедленное решение - сделать ваш Graph подкласс макетом, подобным BoxLayout, и в этом случае его дочерний элемент будет автоматически помещен для его заполнения.

...