Полоса прокрутки Tkinter FigureCanvasTkAgg работает, но подграфики вырезаются из прокручиваемого представления.

Я создал фигуру с переменным количеством подграфиков, используя matplotlib. Я добавил полосу прокрутки на страницу, содержащую этот рисунок, чтобы пользователь мог прокручивать различные рисунки. Полоса прокрутки, после многих попыток, теперь работает, однако фигура, кажется, обрезается там, где находится исходный низ страницы, оставляя некоторые подзаголовки обрезанными (см. Изображение).

Пример кода ниже должен имитировать проблему, с которой я сталкиваюсь. Однако у приведенного ниже кода, похоже, есть своя проблема: он не растягивает фигуру, как в моем исходном коде, для воспроизведения прикрепленного изображения. Тем не менее, это все равно должно дать вам представление - я бы хотел, чтобы графики растягивались за пределы обычного размера кадра, а полоса прокрутки позволяла пользователю просматривать все подграфики.

import tkinter as tk
from tkinter import *
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure



f = Figure(figsize = (1,1), dpi = 100)

a = []

for i in range(0,20):

    a.append(f.add_subplot(20,1,i+1))

f.set_figheight(60)
f.set_figwidth(14)

for i in range(0,20):

    a[i].plot([1,2,3,4,5],[1,2,3,4,5])
    a[i].set_title('Graph ' + str(i+1))



class App(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        container.pack(side = "top", fill = "both", expand = True)
        container.grid_columnconfigure(0,weight=1)
        container.grid_rowconfigure(0,weight = 1)

        self.minsize(620,400)

        self.geometry("{0}x{1}+0+0".format(self.winfo_screenwidth(), self.winfo_screenheight()))

        self.update_idletasks()


        self.frames = {}

        for F in (StartPage, PageTwo):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row = 0, column = 0, sticky = 'nsew')

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        button_p1 = tk.Button(self, text = "PageTwo →",
                              command = lambda: controller.show_frame(PageTwo))
        button_p1.pack(side = TOP, fill = X)

        label = tk.Label(self, text = "Start Page")
        label.pack(fill = X, expand = True)


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)


        button_1 = tk.Button(self, text = "← Start Page",
                         command = lambda: controller.show_frame(StartPage))
        button_1.pack(side = LEFT, anchor = N)

        label_p1 = tk.Label(self, text = "PageTwo")
        label_p1.pack()

        canvas = FigureCanvasTkAgg(f,self)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)

        scroll=Scrollbar(canvas.get_tk_widget())
        scroll.config(command=canvas.get_tk_widget().yview)
        scroll.pack(side = RIGHT, fill=Y)
        canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
        canvas.get_tk_widget().config(yscrollcommand=scroll.set)


        canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)

app = App()

app.mainloop()

Я искал решение в течение последних нескольких дней, но не нашел ни одного, специально адаптированного к моей проблеме, ни того, который я мог бы изменить, чтобы он соответствовал.

Изображение — Отрезать подграфики

Я предполагаю, что решение должно повлечь за собой увеличение высоты кадра или что-то подобное - я пытался сделать это безуспешно.

Я надеюсь сохранить тот же размер окна для всех других страниц - я хочу увеличить высоту PageTwo только для полосы прокрутки.


person Jad    schedule 09.08.2019    source источник


Ответы (1)


Это решение может не решить проблему прокрутки всех осей, но я обнаружил ошибку, которая может привести к слишком быстрому отключению подграфиков. Изменение, которое я бы сделал, заключается в создании экземпляра объекта полосы прокрутки. Передача объекта холста, а не виджета, решила ту же проблему, что и у меня.

класс PageTwo (tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)


    button_1 = tk.Button(self, text = "← Start Page",
                     command = lambda: controller.show_frame(StartPage))
    button_1.pack(side = LEFT, anchor = N)

    label_p1 = tk.Label(self, text = "PageTwo")
    label_p1.pack()

    canvas = FigureCanvasTkAgg(f,self)
    canvas.draw()
    canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)

    scroll=Scrollbar(canvas)
    scroll.config(command=canvas.get_tk_widget().yview)
    scroll.pack(side = RIGHT, fill=Y)
    canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
    canvas.get_tk_widget().config(yscrollcommand=scroll.set)


    canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)
person Nana Owusu    schedule 27.03.2020