اذهب إلى المحتوى
  • 0

هناك مشكلة في استخدام PyQt5 مع بايثون

خالد سعد2

السؤال

حيث انني اريد توقف البرنامج بشكل لحظي في حالة ادخال المستخدم بيانات خاطئة تماما ك تسجيل الدخول في فيس بوك حيث ان ادخل المستخدم بيانات خاطئة لا يغلق البرنامج يظهر له رسالة تخبره بانه ادخل بيانات خطأ وعليه اعادة الادخال المشكلة التي تواجهني هيا ان البرنامج الذي اقوم بعمله ينتقل للصفحة التالية ثم يظهر له رسالة التحذير بكتابة البيانات الخاطئة ويغلق البرنامج مباشرة وهذا الشئ لا ارديه كيف اعمل على حل هذه المشكلة وشكراا مقدما ....

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

 

لحل هذه المشكلة يمكنك استخدام QMessageBox لعرض رسالة تحذير في حالة إدخال بيانات خاطئة ومن ثم توقف تشغيل البرنامج بشكل لحظي، و الأفضل أن تضع جزء من الكود الخاص بك حتى يمكنني الإطلاع عليه بشكل أفضل، سأحاول كتابة كود بسيط يمثل المشكلة مع إستخدام sys.exit(app.exec_()) لتوقيف البرنامج:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QMessageBox

class LoginWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        self.username_input = QLineEdit()
        self.password_input = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.Password)

        login_button = QPushButton('Login')
        login_button.clicked.connect(self.check_login)

        layout.addWidget(self.username_input)
        layout.addWidget(self.password_input)
        layout.addWidget(login_button)

        self.setLayout(layout)
        self.setWindowTitle('Login')

    def check_login(self):
        username = self.username_input.text()
        password = self.password_input.text()

        # Replace this with your login logic
        if username == 'admin' and password == 'password':
            print('Login successful!')
        else:
            QMessageBox.warning(self, 'Login Failed', 'Invalid username or password. Please try again.')
            sys.exit(app.exec_())  # توقف البرنامج في حالة فشل تسجيل الدخول

if __name__ == '__main__':
    app = QApplication(sys.argv)
    login_widget = LoginWidget()
    login_widget.show()
    sys.exit(app.exec_())

لتوقيف البرنامج بشكل فوري بعد عرض رسالة الخطأ، استخدمت الأمر sys.exit(app.exec_()) لإيقاف تشغيل التطبيق داخل دالة check_login بعد عرض الرسالة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا لك اخي شهاب 

    wavelength = 0

    pmin_inDb = 0

    Detector_rise_time = 0



    def user_data(self):

        global transemission_distance

        global bit_rate

        global snr1

        global BW

        global p_min

        global pmin_inDb

        global phtodiode

        global wavelength

        global Detector_rise_time

        global Detector_Model

        global cHoose_your_system

        global enum

        global r

        global f

        enum = 1.6e-19

        f = 1

        r = 0.5

        if self.radioButton.isChecked():

            cHoose_your_system = "analog"

            print(cHoose_your_system)

            transemission_distance = float(self.lineEdit.text())

            bit_rate = float(self.lineEdit_2.text())

            snr1 = float(self.lineEdit_3.text())

            phtodiode = self.comboBox.currentText()

            print(f"The phtodiode is: {phtodiode}")

            k_power_2 = 10 ** (snr1 / 10)

            k_power_2 = round(k_power_2, 2)

            p_min = (2 * enum * f * k_power_2 * bit_rate) / r

            print(f"The min power= {p_min} W")

            pmin_inDb = 10 * math.log10(p_min / 1e-3)

            print(f"The min power in dB= {round(pmin_inDb, 2)} dBm")

        elif self.radioButton_2.isChecked():

            cHoose_your_system = "digital"

            print(cHoose_your_system)

            transemission_distance = float(self.lineEdit.text())

            bit_rate = float(self.lineEdit_2.text())

            # desired_ber = float(self.lineEdit_7.text())

            # snr1 = float(self.lineEdit_3.text())

            phtodiode = self.comboBox.currentText()

            print(f"The phtodiode is: {phtodiode}")



            # bit_rate = float(input("please enter the desired  bitrate: "))

            def ber_equation(snr, target_ber):

                return (2 / (np.pi * snr)) ** 0.5 * np.exp(-snr / 😎 - target_ber



            def find_snr(target_ber):

                initial_guess = 60.0  # Initial guess for SNR

                snr_solution = fsolve(ber_equation, initial_guess, args=(target_ber,))

                return snr_solution[0]



            desired_ber = float(self.lineEdit_7.text())

            resulting_snr = find_snr(desired_ber)

            print(f"SNR for a BER of {desired_ber}: {resulting_snr}")

            resulting_snr = round(resulting_snr, 2)

            snr1 = 10 * math.log10(resulting_snr)

            print("THERESULT", round(snr1, 2))

            k_power_3 = float(10 ** (snr1 / 10))

            k_power_3 = round(k_power_3, 2)

            p_min = float(2 * (enum) * (f) * (k_power_3) * (bit_rate) / r)

            print("The min power=", p_min, "W")

            pmin_inDb = 10 * (math.log10(p_min / 1e-3))

            print("The min power in dB=", round(pmin_inDb, 2), "dB")

            # k_power_2 = 10 ** (snr1 / 10)

            # k_power_2 = round(k_power_2, 2)

            # p_min = (2 * enum * f * k_power_2 * bit_rate) / r

            # print(f"The min power= {p_min} W")

            # pmin_inDb = 10 * math.log10(p_min / 1e-3)

            # print(f"The min power in dB= {round(pmin_inDb, 2)} dBm")

            self

        if not self.radioButton.isChecked() or not self.radioButton_2.isChecked():

            msg = QMessageBox()

            msg.setIcon(QMessageBox.Warning)

            msg.setText("Please choose a system (Analog or Digital).")

            msg.setWindowTitle("Warning")

            msg.setStandardButtons(QMessageBox.Ok)

            msg.exec_()

            # If the user did not make a selection, make them re-enter the system type

            self.lineEdit.clear()

            self.lineEdit_2.clear()

            self.lineEdit_3.clear()

            self.lineEdit_7.clear()

            self.show()


هذا جزء من الكود الخاص بي الذي يتواجد به المشكلة 

بتاريخ 7 دقائق مضت قال خالد سعد2:
😎

اقصد بها 8

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 دقائق مضت قال خالد سعد2:

شكرا لك اخي شهاب 

    wavelength = 0

    pmin_inDb = 0

    Detector_rise_time = 0



    def user_data(self):

        global transemission_distance

        global bit_rate

        global snr1

        global BW

        global p_min

        global pmin_inDb

        global phtodiode

        global wavelength

        global Detector_rise_time

        global Detector_Model

        global cHoose_your_system

        global enum

        global r

        global f

        enum = 1.6e-19

        f = 1

        r = 0.5

        if self.radioButton.isChecked():

            cHoose_your_system = "analog"

            print(cHoose_your_system)

            transemission_distance = float(self.lineEdit.text())

            bit_rate = float(self.lineEdit_2.text())

            snr1 = float(self.lineEdit_3.text())

            phtodiode = self.comboBox.currentText()

            print(f"The phtodiode is: {phtodiode}")

            k_power_2 = 10 ** (snr1 / 10)

            k_power_2 = round(k_power_2, 2)

            p_min = (2 * enum * f * k_power_2 * bit_rate) / r

            print(f"The min power= {p_min} W")

            pmin_inDb = 10 * math.log10(p_min / 1e-3)

            print(f"The min power in dB= {round(pmin_inDb, 2)} dBm")

        elif self.radioButton_2.isChecked():

            cHoose_your_system = "digital"

            print(cHoose_your_system)

            transemission_distance = float(self.lineEdit.text())

            bit_rate = float(self.lineEdit_2.text())

            # desired_ber = float(self.lineEdit_7.text())

            # snr1 = float(self.lineEdit_3.text())

            phtodiode = self.comboBox.currentText()

            print(f"The phtodiode is: {phtodiode}")



            # bit_rate = float(input("please enter the desired  bitrate: "))

            def ber_equation(snr, target_ber):

                return (2 / (np.pi * snr)) ** 0.5 * np.exp(-snr / 😎 - target_ber



            def find_snr(target_ber):

                initial_guess = 60.0  # Initial guess for SNR

                snr_solution = fsolve(ber_equation, initial_guess, args=(target_ber,))

                return snr_solution[0]



            desired_ber = float(self.lineEdit_7.text())

            resulting_snr = find_snr(desired_ber)

            print(f"SNR for a BER of {desired_ber}: {resulting_snr}")

            resulting_snr = round(resulting_snr, 2)

            snr1 = 10 * math.log10(resulting_snr)

            print("THERESULT", round(snr1, 2))

            k_power_3 = float(10 ** (snr1 / 10))

            k_power_3 = round(k_power_3, 2)

            p_min = float(2 * (enum) * (f) * (k_power_3) * (bit_rate) / r)

            print("The min power=", p_min, "W")

            pmin_inDb = 10 * (math.log10(p_min / 1e-3))

            print("The min power in dB=", round(pmin_inDb, 2), "dB")

            # k_power_2 = 10 ** (snr1 / 10)

            # k_power_2 = round(k_power_2, 2)

            # p_min = (2 * enum * f * k_power_2 * bit_rate) / r

            # print(f"The min power= {p_min} W")

            # pmin_inDb = 10 * math.log10(p_min / 1e-3)

            # print(f"The min power in dB= {round(pmin_inDb, 2)} dBm")

            self

        if not self.radioButton.isChecked() or not self.radioButton_2.isChecked():

            msg = QMessageBox()

            msg.setIcon(QMessageBox.Warning)

            msg.setText("Please choose a system (Analog or Digital).")

            msg.setWindowTitle("Warning")

            msg.setStandardButtons(QMessageBox.Ok)

            msg.exec_()

            # If the user did not make a selection, make them re-enter the system type

            self.lineEdit.clear()

            self.lineEdit_2.clear()

            self.lineEdit_3.clear()

            self.lineEdit_7.clear()

            self.show()


هذا جزء من الكود الخاص بي الذي يتواجد به المشكلة 

مثل ما أخبرتك لإيقاف تشغيل البرنامج بشكل فوري بعد عرض رسالة الخطأ، يمكنك استخدام sys.exit() بالشكل التالي:

import sys
from PyQt5.QtWidgets import QMessageBox

# بعد عرض رسالة الخطأ
if not self.radioButton.isChecked() or not self.radioButton_2.isChecked():
    msg = QMessageBox()
    msg.setIcon(QMessageBox.Warning)
    msg.setText("Please choose a system (Analog or Digital).")
    msg.setWindowTitle("Warning")
    msg.setStandardButtons(QMessageBox.Ok)
    msg.exec_()
    # إيقاف تشغيل التطبيق بشكل فوري
    sys.exit()

بهذه الطريقة عندما يتم عرض رسالة الخطأ، سيتم إيقاف تشغيل التطبيق بشكل فوري. 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 دقائق مضت قال خالد سعد2:

شكرا لك ولكنني اريده ان يبقى في الصفحة حتى يتم الاختيار ومن بعدها اكمال العمليات الاخرى 

 

يمكنك ببساطة تغيير مكان إيقاف تشغيل التطبيق بشكل فوري ليتم بعد اختيار النظام المناسب.

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QRadioButton, QPushButton, QMessageBox, QLineEdit
import sys

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        self.radioButton_analog = QRadioButton("Analog")
        self.radioButton_digital = QRadioButton("Digital")
        self.lineEdit = QLineEdit()
        self.lineEdit_2 = QLineEdit()

        button = QPushButton("Submit")
        button.clicked.connect(self.user_data)

        layout.addWidget(self.radioButton_analog)
        layout.addWidget(self.radioButton_digital)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.lineEdit_2)
        layout.addWidget(button)

        self.setLayout(layout)

    def user_data(self):
        if self.radioButton_analog.isChecked() or self.radioButton_digital.isChecked():
            # هنا يتم استمرار العمليات الأخرى بعد اختيار النظام المناسب
            print("Continue processing...")
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Please choose a system (Analog or Digital).")
            msg.setWindowTitle("Warning")
            msg.setStandardButtons(QMessageBox.Ok)
            msg.exec_()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())

بهذا التغيير، عندما يقوم المستخدم بالنقر على الزر Submit، سيتم التحقق مما إذا كان قد قام بتحديد أحد الخيارات (Analog أو Digital)، وفي حالة عدم اختيار أي منهما، سيتم عرض رسالة تحذير ولكن التطبيق لن يتوقف، بل سيستمر في الانتظار حتى يتم اختيار أحد الخيارات.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...