Tkinter ile yazmış olduğum bir tool’u PyQt5 ile yazmaya çalışmaktayım. Tool’un anasayfasında 3 adet farklı button var ve bu buttonlar kullanıcıyı farklı analiz sayfalarına götürüyor. Tkinterda bunu frameleri kullanarak çözmüştüm fakat Qt’de epey uğraşmama rağmen çözemedim. Denediğim ve ulaşmak istediğim konuyu aşağıda örneklemeye çalıştım.
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(object):
def setupUi(self, MainFrame):
MainFrame.setObjectName("MainFrame")
MainFrame.resize(870, 230)
MainFrame.setFrameShape(QFrame.Box)
self.Function1Button = QPushButton(MainFrame)
#I want to go Function 1's frame with this button
self.Function1Button.clicked.connect(????)
self.Function2Button = QPushButton(MainFrame)
#I want to go Function 2's frame with this button
self.Function2Button.clicked.connect(????)
class Function1(object):
def setupUi(self, Frame):
Frame.setObjectName("Frame")
Frame.resize(870, 230)
self.BackButton = QPushButton(MainFrame)
# I want to go previous frame with this button
self.BackButton.clicked.connect(????)
self.Function2Button = QPushButton(MainFrame)
#I want to go Function 2's frame with this button
self.Function2Button.clicked.connect(????)
self.ExecuteButton = QPushButton(MainFrame)
self.ExecuteButton.clicked.connect(self.runfunc)
def runfunc(self):
# Computations
class Function2(object):
def setupUi(self, Frame):
Frame.setObjectName("Frame")
Frame.resize(870, 230)
self.BackButton = QPushButton(MainFrame)
self.BackButton.clicked.connect(????)
self.Function1Button = QPushButton(MainFrame)
#I want to go Function 1's frame with this button
self.Function1Button.clicked.connect(????)
self.ExecuteButton = QPushButton(MainFrame)
self.ExecuteButton.clicked.connect(self.runfunc)
def runfunc(self):
# Computations
Tkinterda o şekilde çözmüştüm zaten ama PyQt5’de frameler arası gezinme kurgusunu başaramadım. Anlamlı bir hata alabildiğim kod örneği olmadığı için yapmak istediğim şeyi anlatmaya çalıştım kod örneğinde, Function1 ve 2 bağımsız birer frame ve ben anasayfadaki (MainWindow) buttonları kullanarak o framelere geçmek ve daha sonra o framedeki Back buttonu ile de önceki sayfaya geri dönmek istiyorum.
Tkinterda ilk gui mi yapmıştım grafik sayfalarına gitmem gerekiyordu ve image falan ekleyememiştim. Daha sonra pyqt5-tool yükledim ve içinde bulunan "designer.exe" ile arayüzümü sürekle bırak mantığıyla tasarladım daha sonra bu tasarımı kaydettiğim dosyada gith bash ya da cmd açıp pyqt5 kodlarına çevirdim. Uygulamama bu modülü import edip kullanıyorum. Arayüzü yazarak oluşturmak yerine böyle bir şey yapabilirsiniz.
Ben de aynı yöntemi kullanıyorum ama import edip başka bir dosyada frame’leri birbirlerine bağlayamadım, sorunum o. Nasıl importlayıp kullandığınızı biraz anlatabilir misiniz acaba?
mainWindow.setCenterWidget(frame) gibi bir seyler direk calisabilir diye dusunmustum ama kod orneginde ne window var ne de widget hiyerarsisini gorebiliyoruz. Hatta bu iki degiskenin senin kodundaki isimlerini bile bilmedigimden oturu, sundan fazla bir sey soyleyemiyorum: https://doc.qt.io/archives/qt-4.8/qmainwindow.html#setCentralWidget
Kodu sirf manali bir hata mesaji iletmek icin paylasmiyoruz, “ben buradayim”, “buradan nereye gidebilirim” diye sormak icin paylasiyoruz. Veya benim gibi, istedigini cokca kez yapmis fakat yillardir qt’ye dokunmamis insanlara giris noktasi oluyor. Veya anlamli bir hata mesaji cikmasa bile kodundaki bariz bir hatayi gosterip “burasi anlamli bir hata mesaji vermeden patlar, yanlis” diyebiliyoruz.
#--------------------main.py--------------------
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from QtMainScreen import Ui_MainWindow#benim tasarladığım içinde buton olan modül
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
class Main(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self,parent=None):
super(Main, self).__init__(parent)
self.setupUi(self)#qtMainScreen.py ismini verdiğim QtMainScreen modülünün içindenki setupUi methodu
self.pushButton_deneme.clicked.connect(self.DenemeDatas)
def DenemeDatas(self,parent=None):
self.graphScreen()
#if you want popup
# mydialog = QtWidgets.QDialog(self)
# mydialog.setModal(True)
# mydialog.exec()
# mydialog.show()
if __name__== '__main__':
App = QtWidgets.QApplication(sys.argv)
PrecautionApp = Main()
PrecautionApp.show()
sys.exit(App.exec())
#--------------------QtMainScreen.py--------------------
from QtGraphic import *
class Ui_MainWindow(object):
#benim eklediğim method
def graphScreen(self):
self.window = QtWidgets.QMainWindow()
self.ui= Ui_MainWindowG()
self.ui.setup(self.window)
self.window.show()
def setupUi(self, MainWindow):
#...
self.retranslateUi(MainWindow)
self.pushButton_ekg.clicked.connect(self.graphScreen)#buralarıedit signal/slot ile cliked eklediğim için kendi oluşturdu
#...
#--------------------QtGraphic.py--------------------
#burada koda dönüştürdükten sonra Ui_MainWindowG ve setup olarak değiştirdim birbiri içinde kullanırken karışmaması adına
#ve bu ekranın içinde sadece widget var
#yerleştirdiğim widgetin üzerine tıklayarak promethedwidgeti seçerek header kısmına MatplotWidget ismini ve widgetin adını da bu şekilde ayarladım
#program otamatik olarak şu modülü import etti
from matplotwidget import MatplotWidget
# -------------------- matplotwidget.py --------------------
from PyQt5.QtWidgets import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class MatplotWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.canvas = FigureCanvas(Figure())
vertical_layout = QVBoxLayout()
vertical_layout.addWidget(self.canvas)
self.canvas.axes = self.canvas.figure.add_subplot(111)
self.setLayout(vertical_layout)
son olarak da bunu eklediğimde mainden programı run ettiğimde ve butona basınca 2. ekrana geçtim.Şu iki videoyu kullanarak yaptım.