Pencere hemen kapaniyor (1)

Menubardaki “Cikis” secenegine tiklandiginda bir message-box aciliyor ve evet veya hayir ile kullanicinin cikma kararini soruyor. Evet calisiyor ve programi kapatiyor. Hayir da calisiyor ama message-box kapandiktan 3-4 saniye sonra Cikis’i cagirdigimiz pencere de kapaniyor. Calismaya devam icin bu pencerenin acik kalmasi gerek. Neyi yanlis yapiyorum? Menünün diger elemanlari düzgün calisiyor.

Bir de menu üzerinden kapali duran yeni bir pencereyi acamiyorum. Pencere QMainwindow sinifindan. Ne yapmam lazim?

Bu isleri düzenleyen kod söyle:

import sys

from PyQt5.QtWidgets import QMainWindow, QMessageBox
from AnaSayfaUI import Ui_MainWindow
from Kodlar import *

#from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *

from PyQt5 import QtCore, QtGui
#from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Daireler(QMainWindow):
def __init__(self):
super().__init__()
self.ui=Ui_MainWindow()
self.ui.setupUi(self)

    #self.ui.actionAnaMenu.triggered.connect(self.anamenu)
    self.ui.actionCikis.triggered.connect(self.CIKIS)

    self.ui.action_Anasayfa.triggered.connect(self.go_page_1)
    self.ui.actionKayitet.triggered.connect(self.go_page_2)
    self.ui.actionDuzenle.triggered.connect(self.go_page_3)
    self.ui.actionSil.triggered.connect (self.go_page_4)
    self.ui.actionHarici.triggered.connect (self.go_page_5)

    self.go_page_1()   #daima 1.ayfaya yönlendirme


def go_page_1(self):
    self.ui.stackedWidget.setCurrentIndex(self.page_1_index)
    LISTELE(self)
def go_page_2(self):
    self.ui.stackedWidget.setCurrentIndex(self.page_2_index)
    KONTROL(self)
    #LISTELE2(self)

def go_page_3(self):
    self.ui.stackedWidget.setCurrentIndex(self.page_3_index)
def go_page_4(self):
    self.ui.stackedWidget.setCurrentIndex(self.page_4_index)
def go_page_5(self):
    self.ui.stackedWidget.setCurrentIndex(self.page_5_index)


#----------------------ÇIKIŞ-----------------------------#
#---------------------------------------------------------#
def CIKIS(self):
Uygulama=QApplication(sys.argv)
Mesajim=‘Programdan çıkmak istediğinize emin misiniz?'

    msgBox = QMessageBox()
    msgBox.setIcon(QMessageBox.Information)
    msgBox.setText(Mesajim)
    msgBox.setWindowTitle("CIKIŞ")
    msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
    msgBox.setEscapeButton(QMessageBox.No)    #Mesaji x ile kapatirsa
    button_evet=msgBox.button(QMessageBox.Yes)
    button_evet.setText("Evet")
    button_hayir=msgBox.button(QMessageBox.No)
    button_hayir.setText("Hayır")
    returnValue = msgBox.exec()

    if returnValue == QMessageBox.Yes:
        #conn.close()
        sys.exit(Uygulama.exec_())
    else:
        window.show()


app=QApplication()
window=Daireler()
window.show()
app.exec()

sys.exit(app.exec_())

Merhaba dünde bahsettiğim üzere kodunuzu düzgün paylaşmamışsınız ki düzgün paylaşsanız dahi bazı parçalar eksik olcağı için cevaplamamız zor olur bu mesajıma yanıt vermeden önce şu linki okursanız sevinirim.
https://forum.yazbel.com/t/soru-sorarken-sikca-dusulen-hatalar/14968

Kodunuzu çalıştıramadığım için sorunu anlamadım. Ama ilk bakıştada çok büyük hatalar var bir scriptte birden fazla QApplication olması başta olmak üzere.

Sizinle kapatılmaya çalışıldığında onay isteyen bir kod paylaşıyorum.

import sys
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QMessageBox, QMainWindow


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        main_layout = QVBoxLayout()

        close_button = QPushButton("Close")
        close_button.clicked.connect(self.close)
        main_layout.addWidget(close_button)

        main_widget = QWidget()
        main_widget.setLayout(main_layout)

        self.setCentralWidget(main_widget)

        self.setWindowTitle("MyWindow")
        self.show()

    def closeEvent(self, event):
        msg_box = QMessageBox()
        msg_box.setIcon(QMessageBox.Warning)
        msg_box.setWindowTitle("Close")
        msg_box.setText("Are you sure you want to close?")
        msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        msg_box.setDefaultButton(QMessageBox.No)

        response = msg_box.exec_()

        if response == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

Bu kısmı anlamadım açıklar mısınız?

Cok tesekkür ederim. Örnek codu hemen benim koda entegre etmeye calisacagim.
Diger soru:
Tüm pencerelerin tepesinde tüm pencerelerin linklerini iceren bir menu bar var. Bu menu barda da “Ana menu” adli bir menü elemani var. Herhangi bir pencereden buna tiklandiginda kullaniciyi yönlendiren ana menü sayfasinin acilmasini istiyorum, ama bunu beceremiyorum.

Büyük hatalar:
QApplication’un ayni codda birden fazla kullanilmasini düzeltiyorum. Ancak bir coda tepede import yoluyla baska pencerelerin codlarini ekliyorsak (örnegin from AnaSayfaUI import Ui_MainWindow) QApplication’un bu import edilen codlarda da buundugu icin tekrarlanmasinda bir sakinca yok sanirim.

Bunun disinda gözünüze carpan air büyük hatalari bildiriseniz sevinirim, init 'ler vardi. Bunlari init olarak düzelttim. Yazbel forumun bir yapistirma hatasi.

Selamlar

designer ile tasarımı nasıl yaptığını göremiyoruz ama bende stackedwidgetli bir uygulama yapmıştım örnek videoları izleyerek.

sayfaları önce bir değişkene atayarak sonra çağırırmısın.

class Daireler(QMainWindow):
def init(self):
super().init()
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
bu kısmın altına

self.sayfa1 = 0
self.sayfa2 = 1
self.sayfa3 = 2 gibi sayfalarını tanımla
def go_page_1(self):
    self.ui.stackedWidget.setCurrentIndex(self.sayfa1)
    LISTELE(self)

anasayfayı göstermesi lazım.

Cok tesekkür.
Zorlandigim konu tam o degil. Birsey deneyip soruyu daha sarih tekrarlayacagim.

Sanırım anladım ama tam emin değilim anladığım kadarıyla bir kod paylaşacağım.

import sys
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QAction, QMenuBar, QLabel


class ChildWindow(QWidget):
    def __init__(self, title, main_window):
        super().__init__()
        self.setWindowTitle(title)
        self.main_window = main_window

        layout = QVBoxLayout()
        button = QLabel(title)
        layout.addWidget(button)
        self.setLayout(layout)

        self.init_menu()

    def init_menu(self):
        menubar = QMenuBar(self)

        file_menu = menubar.addMenu('AnaMenu')

        main_action = QAction('Ana Menu', self)
        main_action.triggered.connect(self.show_main)
        file_menu.addAction(main_action)

        child1_action = QAction('Child 1', self)
        child2_action = QAction('Child 2', self)
        child3_action = QAction('Child 3', self)

        child1_action.triggered.connect(lambda: self.show_child(self.main_window.child1))
        child2_action.triggered.connect(lambda: self.show_child(self.main_window.child2))
        child3_action.triggered.connect(lambda: self.show_child(self.main_window.child3))

        file_menu.addAction(child1_action)
        file_menu.addAction(child2_action)
        file_menu.addAction(child3_action)

        layout = self.layout()
        layout.setMenuBar(menubar)

    def show_main(self):
        self.hide()
        self.main_window.show()

    def show_child(self, child):
        self.hide()
        child.show()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Main Window')

        self.child1 = ChildWindow('Child 1', self)
        self.child2 = ChildWindow('Child 2', self)
        self.child3 = ChildWindow('Child 3', self)

        self.init_ui()

    def init_ui(self):
        central_widget = QWidget()
        layout = QVBoxLayout()

        btn_child1 = QPushButton('Child 1')
        btn_child2 = QPushButton('Child 2')
        btn_child3 = QPushButton('Child 3')

        btn_child1.clicked.connect(lambda: self.show_child(self.child1))
        btn_child2.clicked.connect(lambda: self.show_child(self.child2))
        btn_child3.clicked.connect(lambda: self.show_child(self.child3))

        layout.addWidget(btn_child1)
        layout.addWidget(btn_child2)
        layout.addWidget(btn_child3)

        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

        menubar = self.menuBar()
        file_menu = menubar.addMenu('AnaMenu')

        child1_action = QAction('Child 1', self)
        child2_action = QAction('Child 2', self)
        child3_action = QAction('Child 3', self)

        child1_action.triggered.connect(lambda: self.show_child(self.child1))
        child2_action.triggered.connect(lambda: self.show_child(self.child2))
        child3_action.triggered.connect(lambda: self.show_child(self.child3))

        file_menu.addAction(child1_action)
        file_menu.addAction(child2_action)
        file_menu.addAction(child3_action)
        self.show()

    def show_child(self, child):
        self.hide()
        child.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    sys.exit(app.exec_())

from AnaSayfaUI import Ui_MainWindow
Şeklinde import yapıyorsanız ve __main__ içinde QApplicationu çağırıyorsanız burdaki QApplication ana kodunuza dahil olmaz. O yüzden sorun yok o konuda. Yoksa başka bir dosyadan da olsa gerekmediği sürece 2. bir QApplication oluşturmanız tavsiye edilmez.

  1. Örnek menü tam hayal ettigim isi yapiyor. Aslinda hayal ettigimin de ötesinde kullanim sagliyor. Kullanicilar cok rahat calisacak. Sanirim zorluk cekmeden hemen kendi koduma entegre edebilecegim. Menuden cagrilan tüm pencereler stacked widget’lerden olusuyor. Bunun bir zorluk cikarmayacagini saniyorum.

Zahmetleriniz icin cok ama cok tesekkür ederim.

  1. Pencere kapama icin gönderdiginiz örnek codu benim codlarima entegre ettim. Mükemmel calisiyor. Sizin code cagrildigi pencerenin codundan bagimsiz calistigi icin kolaylikla entegre edilebilecek pratik ve saglam bir cözüm. Bana düsünmedigim veya beceremedigim yeni olanaklar da sagladi.

Selamlar

Menu programinda kücük bir aksaklik cikti.
Asagidaki siraya göre menü elemanlarina tiklarsaniz

Ana menü
Child 1 (mesela)
Ana menü
Ana menü
child 1
karsiniza “Ana menü” yazisi yerine >> isareti cikiyor. Bunun üzerine tiklarsaniz gerisi olmasi gerektigi gibi calismaya devvam ediyor.

isareti kod icinde gecmiyor. Bunu kod kendi yaratiyor. Bu iaretin yerine “Ana menü” yazilmasini nasil saglarim?

Bu bir sorun değil bahsettiğiniz durumun oluşma sebebi widgetın Ana Menu yazılamayacak kadar küçük olmasıdır. ChildWindow a minumumSize atarsanız bu durum çözülecektir.

Cok tesekkür. Pencere ebadi büyüyünce sorun cözüldü. Codun calismasi bence daha güzel ve derli toplu oldu.