#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. Большое вам спасибо!!