Forum: PC-Programmierung Python Graphik mit tkinter und matplotlib


von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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)

von Martin (Gast)


Lesenswert?

Bzw. du zeigst eigentlich nur Figure 2.

von chris_ (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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()

von chris_ (Gast)


Lesenswert?

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.

von chris_ (Gast)


Lesenswert?

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.

von chris_ (Gast)


Lesenswert?


von Martin (Gast)


Lesenswert?

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.

von chris_ (Gast)


Lesenswert?

>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.

von Martin (Gast)


Lesenswert?


von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.