Использование двух FigureCanvasTkAgg в одном окне

#python #tkinter

#python #tkinter

Вопрос:

Я очень новичок в Tkinter, и я пытаюсь создать окно с двумя разными FigureCanvasTkAgg (один поверх другого), и я просто не могу понять, почему один из них не появится. Также, когда я пытаюсь изменить размер окна, оно просто зависает. Может кто-нибудь, пожалуйста, дать мне некоторое представление? Спасибо!

Я попытался создать три разных фрейма и поместить масштаб сверху, а два холста — в середину и снизу.

 from tkinter import *
from tkinter.filedialog import askopenfilename
from Decoder import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation

MOTEDecoder = Decoder()

#original data graph
f = Figure(figsize=(50,50))
a = f.add_subplot(111)

g = Figure(figsize=(50,50))
b = g.add_subplot(111)

def animate(i):
  if MOTEDecoder.inputamp != []:
      pullDatay = MOTEDecoder.inputamp[-100:]
      pullDatax = MOTEDecoder.inputtime[-100:]
      a.clear()
      a.plot(pullDatax,pullDatay)

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)               
        self.master = master
        self.init_Window()

    def init_Window(self):
        self.master.title("MOTE Decoder")

        #Create Top Frame
        top = Frame(root, borderwidth=2, relief="solid", bg="green")
        top.pack(side="top", expand=True, fill="both")

        #Create Slider for Threshold
        threshold_scale = Scale(top, from_=0, to=1.0, 
        resolution = 0.01, orient=HORIZONTAL, label = "Threshold", 
        command = self.change_threshold)
        threshold_scale.pack()

        #Create Middle Frame
        middle = Frame(root, borderwidth=2, relief="solid", bg="yellow")
        middle.pack(side="bottom", expand=True, fill="both")

        canvas_1 = FigureCanvasTkAgg(f, middle)
        canvas_1.get_tk_widget().pack()
        canvas_1.draw()

        #Create Bottom Frame
        bottom = Frame(root, borderwidth=2, relief="solid", bg="blue")
        bottom.pack(side="bottom", expand=True, fill="both")

        canvas_2 = FigureCanvasTkAgg(g, bottom)
        canvas_2.get_tk_widget().pack()
        canvas_2.draw()

        #Create Menu
        menu = Menu(self.master)
        self.master.config(menu=menu)

        #Create File Tab in Menu
        file = Menu(menu)
        file.add_command(label="Import Data", command=self.importdata)
        file.add_command(label="Exit", command=self.client_exit)
        menu.add_cascade(label="File", menu=file)

        #Create Menu Tab in Menu
        edit = Menu(menu)
        edit.add_command(label="Undo")
        menu.add_cascade(label="Edit", menu=edit)

    #Set MOTEDecoder's threshold to value of slider 
    def change_threshold(self, val):
      MOTEDecoder.threshold = val
      print(MOTEDecoder.threshold)

    #Set MOTEDecoder's inputdata to opened file
    def importdata(self):
      filename = askopenfilename()
      MOTEDecoder.get_input(filename)
      # print(filename)

    def client_exit(self):
      exit()



root = Tk()

root.geometry("800x600")

app = Window(root)

# ani = animation.FuncAnimation(f, animate, interval=1)  

root.mainloop()
  

Комментарии:

1. всегда добавляйте тег python , и код будет выделен

2. создайте минимальный рабочий код — ie. без Decoder — чтобы мы могли его запустить.

Ответ №1:

Удалите figsize=(50,50) в обоих Figure() , чтобы увидеть графики.

Вы устанавливаете слишком большие значения, и это создает слишком большие графики, поэтому нет места для отображения второго графика.

Вы также можете удалить root.geometry("800x600") , чтобы лучше видеть графики.

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

Комментарии:

1. Большое вам спасибо!!