Как построить график еще где-нибудь, кроме как в главном кадре (tkinter)?

#python #tkinter #plot #frames

Вопрос:

Я довольно новичок в python или кодировании в целом. Я пытался найти решение своей проблемы, но после нескольких часов поиска в Google я все еще не мог найти решение своей проблемы. Поэтому я надеюсь, что кто-нибудь здесь сможет мне помочь. Кроме того, я ищу не самое умное решение вашей проблемы, а решение, которое легко понять такому новичку, как я.

Итак, моя проблема: у меня уже есть некоторый код для вычисления разных вещей. Все это прекрасно работает. Теперь я хотел бы создать довольно продвинутый графический интерфейс с tkinter, в котором я мог бы реализовывать свои вычисления и т. Д. Графический интерфейс должен содержать несколько страниц, все с различными вариантами расчетов и одним графиком. Я использовал пример Брайана Оукли (найденный здесь на форуме) для страниц. Все это прекрасно работает. Моя проблема в том, как я могу создать график, который присутствует только на каждой отдельной странице. Как я делал это до сих пор, график всегда отображается в главном фрейме, над отдельными страницами. Также таким образом программа застревает в своего рода цикле, так что код все еще выполняется, хотя я закрываю главное окно. Надеюсь, вы понимаете, о чем я пытаюсь попросить ^^

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

 import tkinter as tk
import matplotlib 
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np

class Page(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
    def show(self):
        self.lift()
        
class Page1(Page):
    def __init__(self, *args, **kwargs):
        global var1,var2,var3,var4
        Page.__init__(self, *args, **kwargs)
        
        self.configure(bg="lightblue")
                      
        self.B_load = tk.Button(self,text = "load data", fg = "black", height = 2, width = 20).place(x=10,y=10)
                
        var1 = tk.IntVar()
        self.c1 = tk.Checkbutton(self, text='Show all samples (var1)', bg='lightblue',variable=var1, onvalue=1, offvalue=0, height=1, width=22, anchor='w',command=Var1).place(x=10, y=260)
       
        Application()

class Page2(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        
class MainView(tk.Frame):
    def __init__(self, *args,**kwargs):
         
        tk.Frame.__init__(self,*args,**kwargs)
        
        #self.configure(bg="black")
        
        p1 = Page1(self)
        p2 = Page2(self)
        
        buttonframe = tk.Frame(self)
        container = tk.Frame(self)
        buttonframe.pack(side="top", fill="x", expand=False)
        container.pack(side="top", fill="both", expand=True)
        
        
        p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        
        b1 = tk.Button(buttonframe, text="Main", command=p1.lift)
        b2 = tk.Button(buttonframe, text="Basic Rock-Eval", command=p2.lift)
              
        b1.pack(side="left")
        b2.pack(side="left")
        p1.show()   
        
def Var1():
    global var1
    print("Var1=",var1.get())
    
class Application(tk.Frame):
 
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.createWidgets()

    def createWidgets(self):
        fig, ax1 = plt.subplots(figsize=(8,4)) 
        canvas=FigureCanvasTkAgg(fig,master=root)
        canvas.get_tk_widget().place(x=250,y=50)
        canvas.draw()

    def plot(self):
        ax1.clear()        
         
        FID= [1,2,3,4]
        T= [1,2,3,4]
        ax1.set(xlim=(0,len(FID)),ylim=(0,max(FID)*1.1))
        ax2.set(ylim=(0,max(T) 50))

        ax1.plot(y_1,x,'grey')
        ax2.plot(y_2,x,'r')
        canvas.draw()

root = tk.Tk()
main = MainView(root)
main.pack(side="top", fill="both", expand=True)
root.wm_geometry("1150x700")
root.mainloop()
 

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

1. Сначала вам нужно пройти self при создании экземпляра Application , например app = Application(self) , и позвонить app.place(...) также. Во-вторых, вы должны использовать master=self вместо master=root in FigureCanvasTkAgg(...) .

2. Большое спасибо за быструю помощь. Теперь это работает =)