मैं क्या करने की कोशिश कर रहा हूं, मेनविंडो मेनू से एक संवाद खोलना है, और संवाद में, कुछ इनपुट हैं, या तो लिनेटेक्स्टेड या स्पिनबॉक्स, या कम्बोबॉक्स ... और संवाद बंद करने और डेटा पास करने के लिए एक बटन है मेनविंडो के लिए। मेनविंडो में, कुछ ऑपरेशन किए जाते हैं। मेरे द्वारा बनाए गए उदाहरण में, संचालन मुख्यविंडो में एक साथ संवाद से दो नंबर जोड़ रहे हैं, स्थानीय डिस्क पर एक txt फ़ाइल लिखें और QDesktopServices का उपयोग करके फ़ाइल खोलें।

सुरुचिपूर्ण भी नहीं, मैंने यह काम किया लेकिन मैंने पाया कि संवाद में, जोड़ना और प्रदर्शन और खुली बाहरी फ़ाइल अभी भी निष्पादित की जाती है, भले ही मैं ऊपरी दाएं कोने पर 'x' का उपयोग करके संवाद बंद कर दूं . मैं केवल फ़ंक्शन को बटन से लिंक करना चाहता हूं लेकिन करीबी घटना नहीं।

यहां मैं परिवर्तित py फ़ाइलों को ui और मुख्य फ़ाइल से भी पेस्ट करता हूं।

Mainwindowui.py

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(486, 497)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 486, 22))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionOpenLocal = QtWidgets.QAction(MainWindow)
        self.actionOpenLocal.setObjectName("actionOpenLocal")
        self.menuFile.addAction(self.actionOpenLocal)
        self.menubar.addAction(self.menuFile.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))
        self.label.setText(QtWidgets.QApplication.translate("MainWindow", "Summation", None, -1))
        self.menuFile.setTitle(QtWidgets.QApplication.translate("MainWindow", "File", None, -1))
        self.actionOpenLocal.setText(QtWidgets.QApplication.translate("MainWindow", "OpenLocal", None, -1))

डायलॉगुई.py

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(320, 237)
        self.gridLayout = QtWidgets.QGridLayout(Dialog)
        self.gridLayout.setObjectName("gridLayout")
        self.labelA = QtWidgets.QLabel(Dialog)
        self.labelA.setObjectName("labelA")
        self.gridLayout.addWidget(self.labelA, 0, 0, 1, 1)
        self.alineEdit = QtWidgets.QLineEdit(Dialog)
        self.alineEdit.setObjectName("alineEdit")
        self.gridLayout.addWidget(self.alineEdit, 0, 1, 1, 1)
        self.labelB = QtWidgets.QLabel(Dialog)
        self.labelB.setObjectName("labelB")
        self.gridLayout.addWidget(self.labelB, 1, 0, 1, 1)
        self.blineEdit = QtWidgets.QLineEdit(Dialog)
        self.blineEdit.setObjectName("blineEdit")
        self.gridLayout.addWidget(self.blineEdit, 1, 1, 1, 1)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 2, 0, 1, 2)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtWidgets.QApplication.translate("Dialog", "Dialog", None, -1))
        self.labelA.setText(QtWidgets.QApplication.translate("Dialog", "inputA", None, -1))
        self.labelB.setText(QtWidgets.QApplication.translate("Dialog", "inputB", None, -1))
        self.pushButton.setText(QtWidgets.QApplication.translate("Dialog", "OpenPdf", None, -1)) 

और main.py

import sys
import os

from PySide2 import QtCore, QtGui, QtWidgets
from mainwindowui import Ui_MainWindow
from dialogui import Ui_Dialog


class fileDialog(QtWidgets.QDialog,Ui_Dialog):
    def __init__(self,parent):
        super().__init__(parent)
        self.setupUi(self)
        self.setWindowTitle("Open File")
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.close)


class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.actionOpenLocal.triggered.connect(self.startDialog)
        self.show()

    def startDialog(self):
        dlg = fileDialog(self)
        dlg.exec_()
        dlg.pushButton.clicked.connect(self.getDialogInfo(dlg))


    def getDialogInfo(self,dialogue):
        self.avalue = float(dialogue.alineEdit.text())
        self.bvalue = float(dialogue.blineEdit.text())
        sum = str(self.avalue+self.bvalue)
        self.lineEdit.setText(sum)
        file = open("result.txt","w")
        file.write(sum)
        file.close()

        QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(currentdir +"/result.txt"))


if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    currentdir = os.getcwd()
    mainWin = MainWindow()
    ret = app.exec_()
    sys.exit(ret)

और अगर कोई उन हिस्सों को ठीक कर सकता है जो इतने मानक नहीं लगते हैं, तो मेरी भी बहुत सराहना की जाती है।

2
seasoul 12 अक्टूबर 2018, 05:12

2 जवाब

सबसे बढ़िया उत्तर

आपके कोड में कई त्रुटियां हैं:

  • लाइन dlg.pushButton.clicked.connect(self.getDialogInfo(dlg)) का कोई मतलब नहीं है, आइए थोड़ा विश्लेषण करें कि self.getDialogInfo(dlg) का क्या परिणाम है, फ़ंक्शन getDialogInfo एक कार्य करता है लेकिन ऐसा कुछ भी वापस नहीं करता है जो None के बराबर हो। इसलिए प्रारंभिक कोड dlg.pushButton.clicked.connect(None) के बराबर है, यह वह कार्य करता है जो आप चाहते हैं लेकिन कनेक्शन अनावश्यक है।

  • जब आप exec_() को कॉल करते हैं तो डायलॉग एक कोड देता है और इसका उपयोग यह भेदभाव करने के लिए किया जाता है कि कार्य स्वीकार किया गया है या नहीं, क्योंकि यह डायलॉग बॉक्स का कार्य है। वह कोड तभी लौटाया जाता है जब आप विंडो को बंद करने वाली accept() या reject() विधि को कॉल करते हैं, इसलिए close() को कॉल करने के बजाय आपको accept() को कॉल करना चाहिए, इसलिए जब आप बंद करते हैं X बटन का उपयोग करने वाली विंडो आंतरिक रूप से reject() को कॉल करेगी, ताकि आप प्रत्येक बटन के बीच भेदभाव कर सकें।

  • योग का उपयोग न करें क्योंकि यह एक फ़ंक्शन का नाम है और इसे एक आरक्षित शब्द माना जाता है, ऐसा करने से भविष्य में समस्या हो सकती है।

  • फ़ाइल खोलने के लिए के साथ का उपयोग करें क्योंकि यह फ़ाइल से बाहर निकलने पर स्वचालित रूप से बंद हो जाती है।

  • पथ को मैन्युअल रूप से संयोजित न करें क्योंकि संयोजन मंच पर निर्भर है, आप पुस्तकालय द्वारा प्रदान किए गए कार्यों का बेहतर उपयोग करते हैं os

  • नए कनेक्शन सिंटैक्स का उपयोग करें, यह अधिक पठनीय है

उपरोक्त को ध्यान में रखते हुए, निम्नलिखित समाधान प्राप्त किया जाता है:

import os
import sys

from PySide2 import QtCore, QtGui, QtWidgets

from mainwindowui import Ui_MainWindow
from dialogui import Ui_Dialog


class fileDialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self,parent):
        super().__init__(parent)
        self.setupUi(self)
        self.setWindowTitle("Open File")
        self.pushButton.clicked.connect(self.accept)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.actionOpenLocal.triggered.connect(self.startDialog)
        self.show()

    def startDialog(self):
        dlg = fileDialog(self)
        if dlg.exec_() == QtWidgets.QDialog.Accepted:
            self.getDialogInfo(dlg)

    def getDialogInfo(self, dialogue):
        self.avalue = float(dialogue.alineEdit.text())
        self.bvalue = float(dialogue.blineEdit.text())
        res = str(self.avalue+self.bvalue)
        self.lineEdit.setText(res)
        with open("result.txt","w") as file:
            file.write(res)
        QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(os.path.join(currentdir,"result.txt")))


if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    currentdir = os.getcwd()
    mainWin = MainWindow()
    ret = app.exec_()
    sys.exit(ret)
0
eyllanesc 12 अक्टूबर 2018, 03:21

आप सिग्नल और स्लॉट का उपयोग कर सकते हैं।

import sys
import os

from PySide2 import QtCore, QtGui, QtWidgets
from mainwindowui import Ui_MainWindow
from dialogui import Ui_Dialog


class fileDialog(QtWidgets.QDialog,Ui_Dialog):
    sig_complete = QtCore.Signal(dict)
    def __init__(self,parent):
        super().__init__(parent)
        self.setupUi(self)
        self.setWindowTitle("Open File")
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.slt_save)

    def slt_save(self):
        self.sig_complete.emit({"aline": self.alineEdit.text(), "bline": self.blineEdit.text()})
        self.close()

class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.actionOpenLocal.triggered.connect(self.startDialog)
        self.show()

    def startDialog(self):
        dlg = fileDialog(self)
        dlg.sig_complete.connect(self.getDialogInfo)
        dlg.exec_()

    def getDialogInfo(self,data_dict):
        self.avalue = float(data_dict["aline"])
        self.bvalue = float(data_dict["bline"])
        sum = str(self.avalue+self.bvalue)
        self.lineEdit.setText(sum)
        file = open("result.txt","w")
        file.write(sum)
        file.close()
        QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(currentdir +"/result.txt"))


if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    currentdir = os.getcwd()
    mainWin = MainWindow()
    ret = app.exec_()
    sys.exit(ret)
0
Guo Degang 12 अक्टूबर 2018, 03:29