PyQt5 Pencere Değişimi

Merhabalar,

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

Yorumlarınız için şimdiden teşekkürler.

Burada niye frame kullanarak cozemiyorsun?

Kod ornegi calismadigi ve kritik yapiyi gostermedigi icin yardimci olmuyor.

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.

Aşağıdaki linki incelerseniz belki yardımcı olabilir.

https://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/

  1. seçenek olarak:

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.

Kendi projemdeki kodları paylaşatım.

QtMainScreen.py tasarladığım ana sayfam

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

https://www.youtube.com/watch?v=NcATASQaRHI
https://www.youtube.com/watch?v=2C5VnE9wPhk

1 Beğeni