Hi Hans-Peter
okay, auf ein Neues. Zuvor ein kurzer Hinweis: ich vermute, Du hast noch nicht so viel Erfahrung im Umgang mit Email in solchen Foren, und ich möchte Dir auch nicht vor den Kopf stoßen, aber im Prinzip tust Du es aber mit Deinen Lesern.. Ohne jetzt groß und breit die Netiquette zu erklären, hier ein Auszug: Zitieren durch Einrücken (mit "> " vor jeder Zeile – und ohne Veränderung des Wortlautes) und Weglassen überflüssiger Informationen (Nicht immer alles zitieren!)
Ja, da hast Du völlig Recht. Ich habe nicht so viel Erfahrung mit den Foren. Mit dem Zitieren und das Code-Einfügen habe ich noch nicht ganz richtig kapiert. Weil das Editieren auf dem Browser ziemlich nervtötend und umständlich ist, schreibe ich zuerst meine Frage im Word, wo eine Schreib-Korrektur auch dabei ist. Und wenn ich mit dem Text fertig bin, mache ich wieder mit einem «CUT & PASTE» den Text in den Browser-Editor hinein. Um Textpassagen zitieren zu können, bringe ich die Passagen auch durch «CUT & PASTE» aus dem Browser in Word und schreibe ich meinen Text noch dazu. Dabei füge ich am Anfang der zitierten Zeilen noch ein «>» hinzu. Ich wusste nicht, dass man beim «Allen Antworten» in dem zitierten Text-Bereich auch editieren kann. Ich dachte, dass ich immer meine Sachen am Ende hinzufügen muss. Meinen Lesern wollte ich wirklich nicht vor den Kopf stossen. Man lernt nie aus!!
Jetzt kenne ich Deine Aufgabe und einige Ideen, weiß ich aber immer noch nicht, wo genau Dein Problem liegt? Vielleicht liegt es ja an mir. Ich bin ja schon ein ziemlich alter Knochen. Also hilf mir, Dein spezifischen Problem zu verstehen. So etwas wie: ich erwarte dieses Verhalten, bekomme aber jenes Verhalten.
Mein Problem ist ganz einfach. Jetzt wiederhole ich noch einmal Schritt für Schritt. Wenn ich mein Programm starte, muss in meinem Beispiel-Programm das Fenster mit dem Namen: «MainWindow namens Window1» erscheinen, das sich darauf nur ein Widget und zwar den frisierten QLineEdit oder besser gesagt die Klasse CustomLineEdit beherbergt. oder in meinem wirklichen Programm beim Start, zuerst das Haupt-Fenster (MainWindow https://imgur.com/I1Fdf2f)) erscheint und man erst dann beim Klick auf den Button «Setting» auf das Setting-Fenster (Settings-GUI: https://imgur.com/Ot1OF4J) gelangt. An dieser Stelle haben wir jetzt die gleiche Situation im Beispiel-Code und im wirklichen Code, mit einem Unterschied, dass im Beispiel-Code im «Window 1» kein LineEdit-Feld zu sehen ist, wenn man die «Zeile 12» im Code auskommentiert. Und wenn man die «Zeile 12» drin lässt, erscheint dieses Edit-Feld beim Start des Beispiel-Codes daraussen, was nicht korrekt ist. Wenn man dieses Verhalten auf meinen wirklichen Code übertragen würde, würde es bedeuten, dass das Settings-Fenster gar keine Edit-Felder hat, da sie sich ausserhalb des Settings-Fenster und auf derselben Ebene befinden. Aber im wirklichen Code auf dem Settings-Fenster kannst Du alle QLineEdit-Felder sehen. Hier sind sie noch normale und nicht überladene Widgets wie in meinem Beispiel-Code. Erst wenn mein Beispiel-Code funktioniert, werde ich dieses Verhalten auch auf das Settings-Fenster übertragen.
Du kannst Objekte in .show() und .hide() sichtbar machen und wieder verstecken.
Das ist mir klar und die Show()-Methode habe ich auch auf Zeile 12 verwendet. Diese Zeile dürfte dort überhaupt nicht da sein. Diese show()-Methode befindet sich auch auf "Zeile 49" und sollte dafür sorgen, dass MainWindow (Window 1) erscheint mit einer instanziierten überladenen QLineEdit-Klasse darauf. Starte bitte den Beispiel-Code und sieh, dass ein leeres "Window 1"-Fenster erscheint. Und wenn man die Zeile 12 drin lässt, erscheint ein leeres Fenster mit einem Edit-Feld parallel dazu auf derselben Ebene. Unten ist ein Teil Deiner ersten Antwort über Parent und die Initialisierng. ===========================================================
Okay, hier sagst du, du willst dein widget im mainWindow platzieren.
Das macht man üblicherweise mit einer parent/child relationship. Da du aber in der Ableitung deiner Klasse diese *aller* Argumente beraubt hast, geht dir damit dieser Mechanismus (parent=..) verloren. Vielleicht nimmst Du mal dein __init__() ganz raus, dann solltest Du die default Signatur zurückbekommen, und kannst parent auch wieder setzen.
An dieser Stelle sind meine Groschen nicht gefallen. Ich verstehe nicht die "Beraubung" "*aller*" Argumente und wie habe ich es angestellt. Wie habe ich es beraubt und wie hätte ich es machen müssen? Das hat mit dem Problem zu tun, dass ich immer noch nicht die Verwendung von Parent bei der Initialisierung von Klassen verstanden habe. Deine Beschreibung zu diesem Thema war wirklich gut. Solange ich aber keien Beispiele sehe, tappe ich im Dunkel herum. Wenn Du zwei, drei kleine Code-beispiele hättest, die zeigen, wie und wo man Parent verwendet, bin Ich Dir Tausend Mal dankbar. Und hier versuche ich den Code mit den richtigen Einrückungen einzufügen: Nachdm ich gerade den Code eingefügt habe, sieht alles sehr gut aus. Die Einrückungen sind alle vorhanden. Ich weiss nicht, ob sie auch so bleiben, wenn ich auf die Schaltfläche "Nachricht posten" drücke. Hans-Peter, ich hoffe jetzt, dass Du ein bisschen mehr Information zu meinem Problem hast, um mir weiterzuhelfen. Gruss Mohsen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% import sys from PyQt5.QtWidgets import (QApplication, QLineEdit, QPushButton, QMainWindow, QVBoxLayout, QHBoxLayout, QGridLayout, QWidget) from PyQt5.QtCore import pyqtSignal, pyqtSlot class CustomLineEdit(QLineEdit): clicked = pyqtSignal() def __init__(self): super().__init__() self.show() def mousePressEvent(self, QMouseEvent): self.clicked.emit() class MainWindow(QMainWindow): def __init__( self, parent=None ): super().__init__(parent) self.title = 'Window 1' self.left = 700 self.top = 300 self.width = 200 self.height = 200 self.initUI() def initUI(self): self.keypad_window = Keypad_Window(self) hbox = QHBoxLayout() self.cle = CustomLineEdit() self.cle.clicked.connect(self.show_keypad_window) self.cle.setFixedSize(220, 60) self.cle.setStyleSheet("color: red;" "background-color: yellow;" "font-family: Arial;" "font-weight: Bold;" "font-size: 30pt") hbox.addWidget(self.cle) self.setLayout(hbox) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show() def show_keypad_window(self): self.keypad_window.show() self.hide() def close(self): self.keypad_window.close() super(MainWindow, self).close() @pyqtSlot(str) def update_label(self, txt): self.cle.setText(txt) class Keypad_Window(QWidget): def __init__(self, parent=None): super().__init__() self.parent = parent self.setGeometry(1200, 500, 230, 400) vbox = QVBoxLayout() self.display = QLineEdit() self.display.setFixedSize(220, 60) self.display.setReadOnly(True) self.display.setStyleSheet("color: Blue; " "background-color: lightgreen;" "font-family: Arial;" "font-weight: Bold;" "font-size: 18pt") vbox.addWidget(self.display) """Create the buttons.""" self.buttons = {} self.gridlay = QGridLayout() self.button_name = [['7', '8', '9'], ['4', '5', '6'], ['1', '2', '3'], ['C', '0', '>']] self.command_name = [['7', '8', '9'], ['4', '5', '6'], ['1', '2', '3'], ['delete', '0', 'accept']] for i in range(4): for j in range(3): text = self.button_name[i][j] # keep a reference to the buttons self.buttons[i, j] = QPushButton() self.buttons[i, j].setText(text) self.buttons[i, j].setObjectName(text) self.buttons[i, j].setFixedSize(70, 70) if i == 3: if j == 0: self.buttons[i, j].setToolTip('Each click deletes\na digit to the left') if j == 2: self.buttons[i, j].setToolTip('The whole displayed\nvalue will be taken!') self.buttons[i, j].clicked.connect(self.call_button_fun(i, j, self.command_name)) # add to the GridLayout self.gridlay.addWidget(self.buttons[i, j], i, j) self.buttons[i, j].setStyleSheet("color: blue; " "background-color: cyan;" "font-family: Arial;" "font-weight: Bold;" "font-size: 20pt") vbox.addLayout(self.gridlay) self.setLayout(vbox) def call_button_fun(self, i, j, command_name): def button_fun(): if command_name[i][j] == self.button_name[i][j]: displayed_text = self.display.text() self.new_text = displayed_text + self.button_name[i][j] self.display.setText(self.new_text) if command_name[i][j] == 'accept': print('>-key pressed!') self.parent.cle.setText(self.new_text) self.close() if command_name[i][j] == 'delete': print('C-key pressed!') self.display.setText('') return button_fun if __name__ == "__main__": app = QApplication(sys.argv) mainwindow = MainWindow() # Exception abfangen, wenn sie nicht behandelt wurde sys._excepthook = sys.excepthook def exception_hook(exctype, value, traceback): print(exctype, value, traceback) sys._excepthook(exctype, value, traceback) sys.exit(1) sys.excepthook = exception_hook sys.exit(app.exec_())