Neal Mc Beal
Neal Mc Beal

Reputation: 245

How to call main-window method from a dialog

I have the following dialog with my new keyword "stackoverflow":

Example Dialog

After pressing the "hinzufügen" button the following method is called:

keywords = self.wort_neue_woerter.toPlainText()
try:
    with open("files/schluesselwoerter.txt", 'r') as file:
        output = file.read()
        self.keywords += output
except:
    print("Datei nicht gefunden")
with open("files/schluesselwoerter.txt", 'w') as file:
    file.write(self.keywords)
print("Ausgeführt")

Every keyword is written in the "schlüsselwoerter.txt" file:

schluesselwoerter.txt

The method from the first dialog uses this textfile to populate the ListWidget.

Dialog 1

with open('files/schluesselwoerter.txt', 'r') as file:
output = file.read()
output_list = output.split(',')
for element in output_list:
    item = QtWidgets.QListWidgetItem(element.strip())
    self.wort_uebersicht.addItem(item)

I want to call the Dialog 1 method populate_listWidget right after pressing on the button in Dialog 2. How can i do this?

Here is the full code:

Main Class:

import sys
import main_window
from PyQt5 import QtWidgets

class GUI(QtWidgets.QMainWindow, main_window.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    gui = GUI()
    gui.show()
    sys.exit(app.exec_())

Main_Window:

from PyQt5 import QtCore, QtGui, QtWidgets
import dialog

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setObjectName("listWidget")
        self.horizontalLayout.addWidget(self.listWidget)
        self.main_insert_btn = QtWidgets.QPushButton(self.centralwidget)
        self.main_insert_btn.setObjectName("main_insert_btn")
        self.horizontalLayout.addWidget(self.main_insert_btn)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        try:
            self.populate_list()
        except:
            print("Population failed")

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

        self.main_insert_btn.clicked.connect(self.create_new_keywords)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.main_insert_btn.setText(_translate("MainWindow", "Insert"))

    def create_new_keywords(self):
        keyword_dialog = QtWidgets.QDialog()
        keyword_dialog.ui = dialog.Ui_Dialog()
        keyword_dialog.ui.setupUi(keyword_dialog)
        keyword_dialog.exec_()

    def populate_list(self):
        with open('schluesselwoerter.txt', 'r') as file:
            output = file.read()
            output_list = output.split(',')
            for element in output_list:
                item = QtWidgets.QListWidgetItem(element.strip())
                self.listWidget.addItem(item)

Insert Dialog:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.text_input = QtWidgets.QPlainTextEdit(Dialog)
        self.text_input.setObjectName("text_input")
        self.verticalLayout.addWidget(self.text_input)
        self.insert_btn = QtWidgets.QPushButton(Dialog)
        self.insert_btn.setObjectName("insert_btn")
        self.verticalLayout.addWidget(self.insert_btn)

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

        self.insert_btn.clicked.connect(self.create_new_entry)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.insert_btn.setText(_translate("Dialog", "Insert"))

    def create_new_entry(self):
        keywords = self.text_input.toPlainText()
        try:
            with open("schluesselwoerter.txt", 'r') as file:
                output = file.read()
                keywords += output
        except:
            print("Datei nicht gefunden")
        with open("schluesselwoerter.txt", 'w') as file:
            file.write(keywords)
        print("Ausgeführt")
        self.text_input.setPlainText("")

Upvotes: 0

Views: 1400

Answers (1)

Skandix
Skandix

Reputation: 1994

You simply want to create your insert-dialog while inheriting from both classes (QDialog and Ui_Dialog), like you did in your GUI-class :

from PyQt5 import QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.text_input = QtWidgets.QPlainTextEdit(Dialog)
        self.verticalLayout.addWidget(self.text_input)
        self.insert_btn = QtWidgets.QPushButton('add', Dialog)
        self.verticalLayout.addWidget(self.insert_btn)

class InsertDialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent = None):
        super(InsertDialog, self).__init__(parent)
        self.setupUi(self)
        self.insert_btn.clicked.connect(self.create_new_entry)

    def create_new_entry(self):
        keywords = self.text_input.toPlainText()
        try:
            with open("schluesselwoerter.txt", 'r') as file:
                output = file.read()
                output += (',' + keywords) # add new word to end of list
        except:
            print("File not found")
        with open("schluesselwoerter.txt", 'w') as file:
            file.write(output)
        print("done")
        self.text_input.setPlainText("")

To provide a minimal example, the rest of your code looks like this, after my edits:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.horizontalLayout.addWidget(self.listWidget)
        self.main_insert_btn = QtWidgets.QPushButton('Insert', self.centralwidget)
        self.horizontalLayout.addWidget(self.main_insert_btn)
        MainWindow.setCentralWidget(self.centralwidget)

class GUI(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(GUI, self).__init__()
        self.setupUi(self)
        self.populate_list()
        self.main_insert_btn.clicked.connect(self.create_new_keywords) # do this outside

    def create_new_keywords(self):
        insert_dialog = InsertDialog(self)
        insert_dialog.exec()
        self.populate_list() # refresh list, after you are done

    def populate_list(self):
        try:
            with open('schluesselwoerter.txt', 'r') as file:
                output = file.read()
                output_list = output.split(',')
                self.listWidget.clear() # to prevent double entries
                for element in output_list:
                    item = QtWidgets.QListWidgetItem(element.strip())
                    self.listWidget.addItem(item)
        except:
            print("Population failed")

if __name__ == '__main__':
    [...]

Sidenote: As much I love the german language - I just can recommend you to provide your entire question in english if you want people to help you. It's not to much effort to translate it, especially when you are requesting help (for free!).
Simply have in mind that not everyone likes the country - also it's way more polite.

Upvotes: 1

Related Questions