2017-08-03 23 views
0

Ich versuche, ein MatPlotLib-Plot eines BMP-Bilds im selben Fenster oder Canvas wie das Bild anzuzeigen. Der Code kann das Bild bereits anzeigen, und ich habe bereits das Daten-Diagramm, ich habe nur Probleme beim Einbetten des Diagramms in die GUI. Ich habe versucht, http://matplotlib.org/examples/user_interfaces/embedding_in_tk2.html zu referenzieren, aber ich war ein wenig ratlos, versuchte es in diesen Code zu implementieren.MatPlotLib Plot mit Python Tkinter

Idealerweise hätte ich die Diagrammanzeige direkt unter dem Bild.

Hier ist mein Code:

import tkinter as tk 
from tkinter import * 
from tkinter import filedialog 
from PIL import Image, ImageTk 
from scipy import misc 
import os 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 

class Window(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 

     self.master = master 
     self.pos = [] 
     self.master.title("BMP Image GUI") 
     self.pack(fill=BOTH, expand=1) 

     self.counter = 0 

     menu = Menu(self.master) 
     self.master.config(menu=menu) 

     # File Bar 
     file = Menu(menu) 
     file.add_command(label="Open Image 1", command=self.openImage1) 
     file.add_command(label="Exit", command=self.client_exit) 
     menu.add_cascade(label="File", menu=file) 

     self.canvas = tk.Canvas(self) 
     self.canvas.pack(fill=tk.BOTH, expand=True) 
     self.image = None 
     self.image2 = None 

    def client_exit(self): 
     exit() 

    def openImage1(self): 
     filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select BMP File", 
               filetypes=[("BMP Files", "*.bmp")]) 
     if not filename: 
      return 

     # Image 1 Data Graph 
     image = misc.imread(filename, flatten=False, mode="RGB") 
     sumArray1 = [] 
     for i in range(0, image.shape[0]-1): 
      sumArray1.append(np.sum(image[i])) 
     np.asarray(sumArray1) 
     fig = plt.figure(figsize=(10,3.75), dpi=96) 
     plt.plot(sumArray1) 


     # Image 1 
     load = Image.open(filename) 
     load1 = load.resize((960, 720), Image.ANTIALIAS) 
     w, h = load1.size 
     width, height = root.winfo_screenmmwidth(), root.winfo_screenheight() 

     if self.image is None: 
      self.render = ImageTk.PhotoImage(load1) 
      self.image = self.canvas.create_image((w/2, h/2), image=self.render) 
      root.geometry("%dx%d" % (w, height)) 

root = tk.Tk() 
root.geometry("%dx%d" % (300, 300)) 
root.title("BMP Image GUI") 
app = Window(root) 
app.pack(fill=tk.BOTH, expand=1) 
root.mainloop() 
+0

Was ist das Problem? – Novel

+0

Ich weiß nicht, wie man den Plot/Graphen in das tkinter Fenster mit dem Bild einbetten kann – FLCL

+0

Warum nicht? Der von Ihnen gepostete Code enthält eine Zeile aus dem von Ihnen verlinkten Lernprogramm. Bitten Sie uns, den Rest für Sie zu tun? – Novel

Antwort

0

Ich weiß nicht, ob dies effizient ist, sondern erstellt eine zweite Leinwand als canvas2 und es scheint, dass die Arbeit zu tun. Vorher arbeitete ich auf der gleichen Leinwand wie das BMP-Bild und es wurde nicht angezeigt. Vielleicht gibt es eine Möglichkeit, es nur mit einer Leinwand zu machen.

if self.image is None: 
     self.render = ImageTk.PhotoImage(load1) 
     self.image = self.canvas.create_image((w/2, h/2), image=self.render) 
     root.geometry("%dx%d" % (w, height)) 
     self.canvas2 = FigureCanvasTkAgg(fig, master=root) 
     self.canvas2.show() 
     self.canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=0) 
     self.canvas2._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=0)