Python-PyQT, QT Designer Real Time Graph Editor

Ziyaret Sayisi 821

Başlangıçta C#’ ın sürükle bırak mantığı ile arayüz hazırlayan birisi olarak Python arayüz konusunda beni çok zorladı. Tkinter denemelerimde bu işi çok uğraştırıcı olduğunu görüp vazgeçmiştim. QT ile tanıştığımda drag and drop tasarımın rahatlığını tekrar yakalayıp Python’a daha çok heveslendiğimi söyleyebilirim. Asıl ihtiyacım olan mouse ile sürüklenebilir noktalı grafik arayüzü için çeşitli örnek arayışlarına girdim fakat hazır çözümler beni çok uğraştırdı. Bu yüzden örnek aramayı bırakıp sıfırdan kendim bir yapı hazırladım. Bu yazıda Matplotlib ile “Drag-Drop Point” grafik yapmaya başlayalım.

Tasarıma bir adet widget eklemek ilk aşama için yeterli.

 

Daha sonra “myGui.ui” olarak kaydedilen QT Designer çalışmasını python koduna gönüştürmek için convert.bat isimli şu dosyayı oluşturup çalıştırabilirsiniz.

Dosyayı çalıştırdığınızda size gui.py dosyasını üretecek.

Bu aşamadan sonra tek yapmanız gereken ana çalışma dosyanıza bu python dosyasını dahil etmek. Matplotlib ile arayüzdeki widgeti bağlamak için aşağıdaki örnek incelenebilir.

Yukarıdaki örnekte önce bir figure tanımlaması yapılıp bir subplot oluşturduktan sonra bu figure canvas’a atanır ve bir layout tanımlanarak bu görsel layout a yüklenir. Hazırlanan layout widget a aktarılarak show metodu çalıştırıl. Daha sonra tüm grafik işlemlerini figure ve ax üzerinden yaparız.

Sürüklenebilir noktaları yapmak adına öncelikle nokta sınıfı oluşturarak işe başlayalım. Bu noktalar sürükleneceği için sınıf içerisinde koordinat erişimi, noktayı tanımlayacak bir kimlik (id) ve noktayı güncelleyecek methodlara ihtiyacımız var.

Örnekte 2 adet nokta oluşturup aralarına doğrusal bir çizgi çekelim.

Mouse ile noktaların alanlarını seçebilmek için pick event özelliğini kendi tanımladığımız bir metoda bağladık. Bu sayede noktaya tıkladığımızda bir olay oluşmasını sağlayabiliriz.

Peki hangi noktaya tıkladığımızı nasıl anlarız ? Sınıf tanımında yapılan id tanımı ile bu noktalara bir kimlik verip pick event içerisinde bunu anlamak mümkün

Yukarıda mouse_release ile seçilen noktayı None tanımlayarak olası hatanın önüne geçmeyi unutmayın. Çünkü biz mouse hareket ettikçe güncellenen bir grafik istiyoruz. Tıklamayı bıraktığımızda hatalı güncellemelerin olmaması gerekiyor.

Son aşamada ise plot fonksiyonu kalıyor. Bu metot aslında oldukça basit. Bunun sebebi mouse move event içerisinde zaten tıklanan noktanın x ve y değerlerini güncelliyor olmamız. Geriye sadece ekranı temizleyip güncellemek kalıyor.

Burada ax temizlendikten sonra görsel güzellik açısından bir kaç ekstra kod bulunmaktadır. Örneğin limitlerin tekrar güncellenmesi ve noktalara yazı eklenmesi hatta iki nokta arası çizgi çizmek de buna dahil. Bu işlemlerden sonra canvas draw ile güncelleme yaptığınızda çalışma bu noktada sonlanıyor.

Özetle python kullanmak programcıya çok büyük bir zaman tasarrufu sağlıyor diyebilirim. Gözümüzde büyüyen grafik işleri bile bir kaç saatlik çalışma ile hızlıca sonuç bulabiliyor. Proje dosyasının tam hali aşağıda bulunmaktadır.

Sürükleme işleminden sonrası aşağıdaki gibi olmaktadır.

Yine bir python projesinde bana büyük destek olan sayın Muhittin KAPLAN’a bir teşekkürü borç bilirim.

Bir başka yazıda görüşmek üzere. Esen kalın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir