#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
inFigureCanvasTkAgg(...)
.2. Большое спасибо за быструю помощь. Теперь это работает =)