Matplotlibi Tkinter İçine Gömme

Herkese kolay gelsin yardıma ihtiyacım var. Yaptığım programda butona tıklandığında ilgili verinin grafiğini çizicek ama butona tıklandığında ayrı bir pencere olarak grafiği gösteriyor. Bunu tkinter arayüzünün içinde nasıl gösterebilirim. Matplotlib i butonun command fonksiyonunun içinde tanımladım.

1 Beğeni

Merhaba. Burada bir örnek var:

https://matplotlib.org/3.2.1/gallery/user_interfaces/embedding_in_tk_sgskip.html

2 Beğeni

mantığını tam anlayamadım.

import tkinter as tk

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk
)

root = tk.Tk()

# Figürü tanımlıyoruz.
fig = Figure()

x = range(10)
y = x

# Buradaki 111 değeri, grafiğin ekranın 
# belirli bir yerine yerleştirilmsiyle alakalı bir değer.
# Bu değeri 121, 122, 211, 221, 222, 311 şeklinde değiştip
# nasıl sonuçlar elde ettiğinize bakabilirsiniz.
fig.add_subplot(111).plot(x, y)

# Yukarıdaki figürü tkinter ile birlikte kullanmak için 
# matplotlib'in tkinter için olan backend kütüphanesini kullanıyoruz.
# Bu kütüphanenin adı FigureCanvasTkAgg.
canvas = FigureCanvasTkAgg(figure=fig, master=root)

# Bu widgeti de ekrana aşağıdaki gibi ekliyoruz.
canvas.get_tk_widget().pack(side="top", fill="both", expand=True)

# Bu da matplotlib'e ait navigasyon aracı.
navbar = NavigationToolbar2Tk(canvas=canvas, window=root)

root.mainloop()

@EkremDincel’in paylaştığı linkteki mpl_connect fonksiyonu da matplotlib grafiğini içeren canvas widgetine bir etkinlik bağlamamızı sağlar. İsterseniz @EkremDincel’in paylaştığı örneği tekrar inceleyin. Orada key_press_handler kullanılmış, ama siz ihtiyacınıza göre başka olaylar da ekleyebilirsiniz.

https://matplotlib.org/3.2.1/api/backend_bases_api.html

3 Beğeni

Benim de merak ettiğim bir konuydu. Hem soranlara hem cevaplayıp açıklayanlara teşekkür ederim.

Söylediğiniz işe yaradı çok teşekkür ederim ancak farklı bir sıkıntı yarattı. Programımda listboxtan veri seçince grafiğinin yazdırması gerekiyordu. İlk veriyi seçince sıkıntı yok grafiği yazdırıyor ancak başka bir veri seçince bu sefer aynı grafik ekranda kalıyor değişmiyor. Bu sorunun nasıl aşabilirim?

*MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.*
*  fig.add_subplot(111).plot(conf)*

Şöyle bir hata veriyor.

Kodları görmeden bir şey diyemem.

    if veri_ismi == "Confirmed":
    for i in new_api:
        conf.append(i["Confirmed"])
    fig.add_subplot(111).plot(conf)
    canvas = FigureCanvasTkAgg(figure=fig, master=pencere)
    canvas.get_tk_widget().pack(side="top", fill="both", expand=True)
    navbar = NavigationToolbar2Tk(canvas=canvas, window=pencere)

Bu benim butonuma tıklayınca çalışacak fonksiyonumun içinde. Butona tıklayınca listboxtan seçili değerin apid’den aldığı verileri listeye aktarıyor. Listeyi de grafikte gösteriyor. Tekrar listboxtan başka değeri seçince api’den başka veriyi aktarıp listboxa ekleyip grafiğini çizdirmesi lazım. Backend kütüphanesini kullanmayınca çalışmıştı ancak ben tkinter arayüzünde olmasını istiyorum.

Bu tuşa her bastığınızda pencere tekrardan tanımlanıyor mu peki?

Hayır. Onu nasıl yapacağım?

Kodları bir paylaşabilir misiniz?