Добавить кнопку и matplotlib в boxlayout - PullRequest
0 голосов
/ 01 августа 2020

В kivy я вызываю модальное представление, и в этом модальном представлении есть Boxlayout, который будет иметь 2 виджета. 1 виджет может быть чем угодно, другой - графиком matplotlib, поэтому я могу видеть оба одновременно. показывает matplotlib - опять же, все модальное представление просто не отображается, это просто сюжет. Я попытался создать еще один виджет kivy с ограниченным size_hint, затем добавил к нему сюжет, а затем добавил виджет в свой основной блок, но результат был тот же

Я прикрепил свой код kivy и код для plot, изображение - это то, что я хочу, чтобы выглядело модальное представление, где правая сторона - график

Наконец, я уверен, что есть другие способы делать то, что я хочу, например, в matplotlib есть виджеты, которыми я мог бы быть в состоянии использовать. Но это кажется плохой практикой - внезапно переключаться с kivy, который я использовал все это время, и держу пари, что смогу это как-то сделать

Есть предложения? * Как я хочу, чтобы мое модальное представление выглядело, но с сюжетом в правой части

1 Ответ

0 голосов
/ 02 августа 2020

Решение: Я нашел что-то, что может интегрировать matplotlib с kivy, но документация была мега плохой, но решение, которое я нашел, лучше.

Я обнаружил kivy garden (пользовательские пакеты kivy), в котором есть пакет строить графики в киви. Приложен мой новый код и скриншот моей программы

Код: пользователь нажал кнопка, запускающая этот метод. Он создает модальное представление, которое содержит boxlayout, который содержит 2 виджета: 1 - это прокручиваемая сетка, состоящая из меток и кнопок, а другая - график. Код для графика - это второй фрагмент кода

    # pm: ticker = ticker clicked
    def modal_view(self, ticker, instance):
        mainview = ModalView(size_hint = (0.75, 0.75))
        box = BoxLayout(orientation = "horizontal")
        
        # make a scrollable gridlayout
        scroll = ScrollView(do_scroll_x = False, do_scroll_y = True, size_hint_x = 0.3)                           # a scroll view will contain the ticker gridlayout
        ticker_grid = GridLayout(rows = len(self.ticker_list), cols = 2, size_hint_y = None)   # holds tickers
        ticker_grid.bind(minimum_height = ticker_grid.setter("height"))                    # makes the gridlayout scrollabel via the scrollview
        
        # populate the scrollview / gridlayout
        for i in range(0, len(self.ticker_list)):
            ticker_grid.add_widget(Label(text = self.ticker_list[i // 2], height = 200, size_hint_x = 0.6))
            ticker_grid.add_widget(Button(text = "", size_hint_x = 0.4))

            # if ticker is selected, add button to cancel it
            if (self.ticker_list[i] == ticker):
                ticker_grid.children[i].text = 'X'
                ticker_grid.children[i].fbind("on_release", self.modalview_cancel_ticker, ticker_grid.children[i])

        # combine everything
        scroll.add_widget(ticker_grid)                
        box.add_widget(scroll)
        box.add_widget(python_testing.make_graph())
        mainview.add_widget(box)
        
        mainview.open()
def make_graph():
    # Prepare the data
    x = [1,2,3,4,5,6,7,8,9,10]
    ratings = [4,5,8,9,4,3,2,6,8,7]

    # make the graph
    graph = Graph(xlabel='Dates', ylabel='Ratings', x_ticks_minor = 1, x_ticks_major = 2,
                    y_ticks_minor = 1, y_ticks_major = 2, y_grid_label=True, x_grid_label=True,
                    padding=5, x_grid=True, y_grid=True, xmin=0, xmax=10, ymin=0, ymax=10)

    plot = MeshLinePlot(color=[1, 0, 0, 1])
    plot.points = [(i, j) for i, j in zip(x, ratings)]

    graph.add_plot(plot)
    return graph

Обратите внимание, если вы используете этот код: в make_graph () отображение точек данных является сложной задачей. plot.points = [(i, j) for i, j in zip(x, ratings)] - единственный способ сделать это

введите описание изображения здесь

...