Ich versuche gerade Matplotlib-Graphiken in einer tkinter Oberfläche frei zu positionieren. Irgendwie wird aber immer nur eine Graphik gezeigt. Wie kann ich beide Graphen sichtbar machen? Oder ist es eventuell gar nicht möglich, zwei frei positionierbare Graphen in der Oberfläche zu haben?
Du baust zwei Plots (Figure), die übereinander liegen. So geht es bei mir:
1 | f = Figure(figsize=(3, 2), dpi=100) |
2 | a = f.add_subplot(121) |
3 | a.plot([1,2,3,4,5,6,7,8],[1,2,1,3,8,9,3,5]) |
4 | |
5 | canvas = FigureCanvasTkAgg(f, mainWindow) |
6 | canvas.get_tk_widget().pack(padx=150, pady=100,side=tk.LEFT) |
7 | |
8 | a2 = f.add_subplot(122) |
9 | a2.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5]) |
10 | |
11 | canvas2 = FigureCanvasTkAgg(f, mainWindow) |
12 | canvas2.get_tk_widget().pack(padx=300, pady=100, side=tk.RIGHT) |
Danke für's drauf schauen. In deiner Version nutzt Du die MatPlotLib-Funkton "subplot", die mehrere Graphen in eine MatPlotLib-Ausgabe zeichnet. Damit brauch man kein canvas2, weil nur eine MatPlotLib-Graphik gezeichnet wird. Das ist nicht, was ich suche, weil ich die zweite Graphik (bzw. beliebig viele) frei x/y positionieren will.
Es scheint, dass deine padx und pady Probleme machen. Wenn ich die so wie hier reduziere, dann sehe ich zwei Kurven:
1 | import matplotlib |
2 | |
3 | from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk |
4 | |
5 | from matplotlib.figure import Figure |
6 | |
7 | import tkinter as tk |
8 | from tkinter import ttk |
9 | |
10 | LARGE_FONT = ("Verdana", 12) |
11 | |
12 | mainWindow = tk.Tk() |
13 | mainWindow.geometry("1024x640") |
14 | |
15 | # tk.Frame.__init__(mainWindow, parent)
|
16 | label = tk.Label(mainWindow, text="Graph Page!", font=LARGE_FONT) |
17 | label.place(x=600, y=50) |
18 | |
19 | button1 = ttk.Button(mainWindow, text="little button", command=lambda: controller.show_frame(StartPage)) |
20 | button1.place(x=600, y=300) |
21 | |
22 | f = Figure(figsize=(3, 2), dpi=100) |
23 | a = f.add_subplot(111) |
24 | a.plot([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 1, 3, 8, 9, 3, 5]) |
25 | |
26 | canvas = FigureCanvasTkAgg(f, mainWindow) |
27 | canvas.get_tk_widget().pack(padx=10, pady=10, side=tk.LEFT) |
28 | |
29 | f2 = Figure(figsize=(3, 2), dpi=100) |
30 | a2 = f2.add_subplot(111) |
31 | a2.plot([1, 2, 3, 4, 5, 6, 7, 8], [5, 6, 1, 3, 8, 9, 3, 5]) |
32 | |
33 | canvas2 = FigureCanvasTkAgg(f2, mainWindow) |
34 | canvas2.get_tk_widget().pack(padx=10, pady=10, side=tk.LEFT) |
35 | |
36 | mainWindow.mainloop() |
Martin (Gast) >Es scheint, dass deine padx und pady Probleme machen. Wenn ich die so >wie hier reduziere, dann sehe ich zwei Kurven: Ja, bei mir erscheinen damit auch zwei Plot-Windows. Allerdings hat es überhaupt keinen Einfluss, wenn ichz.B. die Zeile 34 auf eine andere Position ändere:
1 | canvas2.get_tk_widget().pack(padx=10, pady=200, side=tk.LEFT) |
Es sieht so aus, als wenn der Fenstermanager mit "pack" die Positionsangaben ignoriert.
padx und pady haben beschreiben wohl eher die Abstände der Elemente im Geometry-Manager als die absolute Position, welche ich gerne festlegen würde.
Eine absolute Position in X und Y sollte sich mit ".place" festlegen lassen. Dazu gibt es viele Beispiele im WWW. Ich habe das bisher nicht genutzt.
>Eine absolute Position in X und Y sollte sich mit ".place" festlegen >lassen. Hab ich schon probiert. Aber es sieht so aus, als wenn die Window-Klasse
1 | FigureCanvasTkAgg |
für PyPlot kein "place" hat.
Dann probier's doch so: https://stackoverflow.com/questions/60941415/place-method-for-figurecanvastkagg-in-tkinter-window
Martin
>Dann probier's doch so:
Super, damit geht es.
Danke :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.