New overriden and generated QLineEdit class will not be placed on the

Hi all I have a question about a clickable QLineEdit. After searching some Hints, how to use QMouseEvent, I've written a program which is working almost good but with a small or perhaps big ugliness and that is: Below is the imgur link to the screenshots of my program after clicking the buttons in sequence: https://imgur.com/a/rfcP3qB As you will see in the code blow, I override the QlineEdit widget and define a new class " CustomLineEdit " to generate a "clicked" signal, when the user pressed with mouse on this field. I use this "CustomLineEdit" class and place it on the MainWindow with the desired "layout". I couldn't figure out, why this widget is placed not in the MainWindow, but outside this window, as you can see in the top picture of the attached screenshots. When I take the line 12 (self.show()) from the code, the generated class will not appear. The problem here is that at the beginning, the MainWindow with a LineEdit field should appear at the program start. Then, after clicking on this field, the keypad should come up outside the MainWindow. Could anyone see, where my mistake is? Thanks for any help. Mohsen Here is the code: &&&&&&&&&&&&&&&&&&&&&&&&&&& 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_())

Dear Mohsen, You have contacted the German Python mailinglist, so almost all conversations on here are held in German. If you'd like to communicate in English, it might be a good idea to contact the general Python mailinglist, whose main language is English. You can connnect to the general list under python-list@python.org. Unfortunately I cannot help you with your Problem, but I am sure there are people knowing QT in conjunction with Python. Best Regards Lars Am 08.10.21 um 11:14 schrieb Mohsen Owzar:
Hi all I have a question about a clickable QLineEdit. After searching some Hints, how to use QMouseEvent, I've written a program which is working almost good but with a small or perhaps big ugliness and that is: Below is the imgur link to the screenshots of my program after clicking the buttons in sequence: https://imgur.com/a/rfcP3qB As you will see in the code blow, I override the QlineEdit widget and define a new class " CustomLineEdit " to generate a "clicked" signal, when the user pressed with mouse on this field. I use this "CustomLineEdit" class and place it on the MainWindow with the desired "layout". I couldn't figure out, why this widget is placed not in the MainWindow, but outside this window, as you can see in the top picture of the attached screenshots. When I take the line 12 (self.show()) from the code, the generated class will not appear. The problem here is that at the beginning, the MainWindow with a LineEdit field should appear at the program start. Then, after clicking on this field, the keypad should come up outside the MainWindow. Could anyone see, where my mistake is? Thanks for any help. Mohsen Here is the code: &&&&&&&&&&&&&&&&&&&&&&&&&&& 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_()) _______________________________________________ python-de Mailingliste -- python-de@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-de-leave@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: liedtke@punkt.de
-- punkt.de GmbH Lars Liedtke .infrastructure Kaiserallee 13a 76133 Karlsruhe Tel. +49 721 9109 500 https://infrastructure.punkt.de info@punkt.de AG Mannheim 108285 Geschäftsführer: Jürgen Egeling, Daniel Lienert, Fabian Stein

Am Freitag, 8. Oktober 2021, 11:14:54 CEST schrieb Mohsen Owzar:
Hi all I have a question about a clickable QLineEdit. After searching some Hints, how to use QMouseEvent, I've written a program which is working almost good but with a small or perhaps big ugliness and that is: Below is the imgur link to the screenshots of my program after clicking the buttons in sequence: https://imgur.com/a/rfcP3qB
Ich schätze, wir können an diesem Punkt in deutsch weitermachen. Vielleicht solltest Du erst mal versuchen, dein Problem möglichst kurz zu formulieren. Ich kann hier nur eine Ablaufbeschreibung finden.
As you will see in the code blow,
Ein whitespace damaged code ist ziemlich unbrauchbar, you know..
I override the QlineEdit widget and define a new class " CustomLineEdit " to generate a "clicked" signal, when the user pressed with mouse on this field. I use this "CustomLineEdit" class and place it on the MainWindow with the desired "layout". I couldn't figure out, why this widget is placed not in the MainWindow, but outside this window, as you can see in the top picture of the attached screenshots.
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.
When I take the line 12 (self.show()) from the code, the generated class will not appear. The problem here is that at the beginning, the MainWindow with a LineEdit field should appear at the program start. Then, after clicking on this field, the keypad should come up outside the MainWindow.
Hier widersprichst du dir. Aber ich glaube, ich habe dein Problem trotzdem richtig interpretiert. Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassing, event handling, und so finden. Wichtig sind da noch die return codes aus den event handlern.. Gutes Gelingen. Cheers, Pete
Could anyone see, where my mistake is? Thanks for any help. Mohsen Here is the code: &&&&&&&&&&&&&&&&&&&&&&&&&&& 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_()) _______________________________________________ python-de Mailingliste -- python-de@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-de-leave@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: hpj@urpla.net

Hans-Peter Jansen schrieb am Freitag, 8. Oktober 2021 um 18:07:22 UTC+2:
Am Freitag, 8. Oktober 2021, 11:14:54 CEST schrieb Mohsen Owzar:
Hi all I have a question about a clickable QLineEdit. After searching some Hints, how to use QMouseEvent, I've written a program which is working almost good but with a small or perhaps big ugliness and that is: Below is the imgur link to the screenshots of my program after clicking the buttons in sequence: https://imgur.com/a/rfcP3qB Ich schätze, wir können an diesem Punkt in deutsch weitermachen.
Vielleicht solltest Du erst mal versuchen, dein Problem möglichst kurz zu formulieren. Ich kann hier nur eine Ablaufbeschreibung finden.
As you will see in the code blow, Ein whitespace damaged code ist ziemlich unbrauchbar, you know.. I override the QlineEdit widget and define a new class " CustomLineEdit " to generate a "clicked" signal, when the user pressed with mouse on this field. I use this "CustomLineEdit" class and place it on the MainWindow with the desired "layout". I couldn't figure out, why this widget is placed not in the MainWindow, but outside this window, as you can see in the top picture of the attached screenshots. 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.
When I take the line 12 (self.show()) from the code, the generated class will not appear. The problem here is that at the beginning, the MainWindow with a LineEdit field should appear at the program start. Then, after clicking on this field, the keypad should come up outside the MainWindow. Hier widersprichst du dir. Aber ich glaube, ich habe dein Problem trotzdem richtig interpretiert.
Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassing, event handling, und so finden. Wichtig sind da noch die return codes aus den event handlern..
Gutes Gelingen.
Cheers, Pete
Could anyone see, where my mistake is? Thanks for any help. Mohsen Here is the code: &&&&&&&&&&&&&&&&&&&&&&&&&&& 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_()) _______________________________________________ python-de Mailingliste -- pyth...@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-...@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: h...@urpla.net
Danke Hans-Peter für Deine Antwort. Ich wurde auch von Lars benachrichtigt, dass ich auf der falschen Seite (Deutsch) meine Frage in Englisch gestellt habe. Damit ich nicht noch eine Frage aufmache, werde ich unten meine Frage noch einmal auf Deutsch stellen. Aber zuerst zu Deinen Fragen:
Vielleicht solltest Du erst mal versuchen, dein Problem möglichst kurz zu formulieren. Ich kann hier nur eine Ablaufbeschreibung finden. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ich dachte, dass ich das getan hätte und dass ich zu viel geschrieben habe. OK, wenn es so ist, ist nachfolgend eine kurze Beschreibung meines Problems: Ich muss eine GUI für eine Relais-Test-Ablauf-Steuerung schreiben, die in der Lage ist, durchs Betätigen einiger «Buttons» die Kontakte zu schliessen oder zu öffnen. Man kann die Wartezeit für die Schliess- / Öffnen-Zeit individuell für jeden Test einstellen. Dafür gibt es einen Button auf der Haupt-GUI (Settings), mit dessen Hilfe man auf das Settings-Fenster gelangt. Auf diesem Fenster befinden sich mehrere QLineEdit-Felder, die unter anderem für die einigen Zeit-Einstellungen zuständig sind.
Jetzt kommt mein Problem und Anliegen: Da am Ende, dieses Programms auf einem Raspberry Pi unter Linux laufen soll und nur ein Tablet mit Touchscreen und kein Keyboard vorhanden ist, habe ich um jedes Edit-Feld einen Button «Plus» oder «Minus» hinzugefügt, die den angezeigten Wert im Feld erhöhen oder erniedrigen. Wenn aber der gewünschte Wert sehr weit vom angezeigten Wert liegt, muss man mehrere Male klicken, um den Endwert zu erreichen. Damit es schneller geht, habe ich mir gedacht, dass ich mit einem Klick in dem Edit-Feld mit der Maus / Finger auf dem Tablet ein neues von mir geschriebenes Keypad-Objekt öffne, mit dessen Hilfe man den Endwert sofort eintippt und mit OK diesen Wert in das Edit-Feld übernimmt.
Ein whitespace damaged code ist ziemlich unbrauchbar, you know %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Das habe ich nicht verstanden, was Du damit meinst. Vielleicht weil das Wort «below» falsch «blow» geschrieben wurde oder vielleicht weil ich den Code nicht direkt nach dieser Zeile, sondern am Ende meiner Frage gebracht habe, war irgendwie nicht verständlich.
Dein Vorschlag mit dem Wegnehmen von «__init__()» %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OK, das muss ich ausprobieren
Hier widersprichst du dir. Aber ich glaube, ich habe dein Problem trotzdem richtig interpretiert. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ich glaube nicht. Damit es klar wird, werde ich den Link zu meinen eigentlichen GUIs-Screenshots auch hinzufügen, um es besser verstehen zu können.
Screenshot von MainWindow-GUI: https://imgur.com/I1Fdf2f Screenshot von Settings-GUI: https://imgur.com/Ot1OF4J Wenn ich auf dem Settings-Fenster (in meinem Beispiel Window 1 oder MainWindow) bin, wo die ganzen QLineEdit-Felder vorhanden sind, sind alle Felder sichtbar. Man kann ihre Werte entweder mit «+» oder «-» ändern oder mit einem Klick in das Feld das Keypad-Fenster (in meinem Beispiel Keypad_Window) öffnen. Aber dieses Fenster muss erst dann erscheinen, wenn auf das Feld eingeklickt wird. In meinem Beispiel-Code erscheint das «Window 1» (die original GUI Settings) ohne Edit-Feld
Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassing, event handling, und so finden. Wichtig sind da noch die return codes aus den event handlern %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ja, ich habe die verschieden Versionen gesehen. Gerade deswegen bin ich verwirrt. Ich weiss nicht, wann ich die «__init__()» und «super()» Zeilen so leer lasse und wann bringe ich in «__init__» das Argument «parent=None» und «parent» in «Super().__init__(parent)». In verschiedenen Beispiele sind manchmal die eine Version in den anderen die andere Version oder sogar manchmal eine Kombination der beiden. Ich konnte daraus nicht schlau werden. Nirgendwo habe ich eine einfache klare Dokumentation bei meinen Google-Searches zu diesem Thema gefunden. Wie Du z. B. in Deinem Vorschlag erwähnt hast, warum soll ich den "init"-Part wegnehmen. Was hat das zur Folge, wenn es dadrin ist?
Daher meine Frage, ob jemand mir wirklich erklären kann, wann ich die Argument-Felder leer lasse und wann ich sie befüllen muss. Ich hoffe, dass mit oben gesagten / geschriebenen Du mein Problem besser verstehst und vielleicht mir eine Ausweg zeigst. Gruss Mohsen &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Und nun meine Frage in Deutsch wiederholt: Den Code werde ich nicht noch einmal hinzufügen, da er von der ersten englischen Frage enztnommen werden kann. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Hallo zusammen Ich habe eine Frage zu einem anklickbaren QLineEdit. Nachdem ich einige Hinweise zur Verwendung von QMouseEvent gesucht habe, habe ich ein Programm geschrieben, das fast gut funktioniert, aber mit einer kleinen oder vielleicht großen Hässlichkeit und das ist: Unten ist der imgur-Link zu den Screenshots meines Programms, nachdem Sie nacheinander auf die Schaltflächen geklickt haben: https://imgur.com/a/rfcP3qB Wie Sie im angehängten Code unten sehen, überschreibe ich das QlineEdit-Widget und definiere eine neue Klasse " CustomLineEdit ", um ein "geklicktes" Signal zu erzeugen, wenn der Benutzer mit der Maus auf dieses Feld drückt. Ich benutze diese "CustomLineEdit" Klasse und platziere sie auf dem MainWindow mit dem gewünschten "Layout". Ich konnte nicht herausfinden, warum dieses Widget nicht im MainWindow, sondern außerhalb dieses Fensters platziert wird, wie Sie im oberen Bild der beigefügten Screenshots sehen können. Damit ich überhaupt dieses QLineEdit-Feld sehe, musste ich die Zeile 12 (self.show()) im Code hinzufügen. Wenn ich die Zeile 12 aus dem Code nehme, wird die generierte Klasse nicht angezeigt. Das Problem hierbei ist, dass am Anfang das MainWindow mit einem LineEdit-Feld beim Programmstart erscheinen sollte. Nachdem Sie auf dieses Feld geklickt haben, sollte die Tastatur außerhalb des MainWindow erscheinen. Könnte jemand sehen, wo mein Fehler liegt? Danke für jede Hilfe. Mohsen

Hallo Mohsen, 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!) Am Samstag, 9. Oktober 2021, 06:10:02 CEST schrieb Mohsen Owzar:
Danke Hans-Peter für Deine Antwort. Ich wurde auch von Lars benachrichtigt, dass ich auf der falschen Seite (Deutsch) meine Frage in Englisch gestellt habe. Damit ich nicht noch eine Frage aufmache, werde ich unten meine Frage noch einmal auf Deutsch stellen. Aber zuerst zu Deinen Fragen:
Vielleicht solltest Du erst mal versuchen, dein Problem möglichst kurz zu formulieren. Ich kann hier nur eine Ablaufbeschreibung finden.
Ich dachte, dass ich das getan hätte und dass ich zu viel geschrieben habe. OK, wenn es so ist, ist nachfolgend eine kurze Beschreibung meines Problems: Ich muss eine GUI für eine Relais-Test-Ablauf-Steuerung schreiben, die in der Lage ist, durchs Betätigen einiger «Buttons» die Kontakte zu schliessen oder zu öffnen. Man kann die Wartezeit für die Schliess- / Öffnen-Zeit individuell für jeden Test einstellen. Dafür gibt es einen Button auf der Haupt-GUI (Settings), mit dessen Hilfe man auf das Settings-Fenster gelangt. Auf diesem Fenster befinden sich mehrere QLineEdit-Felder, die unter anderem für die einigen Zeit-Einstellungen zuständig sind.
Jetzt kommt mein Problem und Anliegen: Da am Ende, dieses Programms auf einem Raspberry Pi unter Linux laufen soll und nur ein Tablet mit Touchscreen und kein Keyboard vorhanden ist, habe ich um jedes Edit-Feld einen Button «Plus» oder «Minus» hinzugefügt, die den angezeigten Wert im Feld erhöhen oder erniedrigen. Wenn aber der gewünschte Wert sehr weit vom angezeigten Wert liegt, muss man mehrere Male klicken, um den Endwert zu erreichen. Damit es schneller geht, habe ich mir gedacht, dass ich mit einem Klick in dem Edit-Feld mit der Maus / Finger auf dem Tablet ein neues von mir geschriebenes Keypad-Objekt öffne, mit dessen Hilfe man den Endwert sofort eintippt und mit OK diesen Wert in das Edit-Feld übernimmt.
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.
Ein whitespace damaged code ist ziemlich unbrauchbar, you know Das habe ich nicht verstanden, was Du damit meinst.
white space damaged ist besonders für Python code ziemlich blöd, weil die fehlenden Einrückungen den Code unbrauchbar machen. Generell sollte solcher code so eingefügt werden, dass ein cut und paste möglich ist.
Damit es klar wird, werde ich den Link zu meinen eigentlichen GUIs-Screenshots auch hinzufügen, um es besser verstehen zu können.
Screenshot von MainWindow-GUI: https://imgur.com/I1Fdf2f Screenshot von Settings-GUI: https://imgur.com/Ot1OF4J
Wenn ich auf dem Settings-Fenster (in meinem Beispiel Window 1 oder MainWindow) bin, wo die ganzen QLineEdit-Felder vorhanden sind, sind alle Felder sichtbar. Man kann ihre Werte entweder mit «+» oder «-» ändern oder mit einem Klick in das Feld das Keypad-Fenster (in meinem Beispiel Keypad_Window) öffnen. Aber dieses Fenster muss erst dann erscheinen, wenn auf das Feld eingeklickt wird. In meinem Beispiel-Code erscheint das «Window 1» (die original GUI Settings) ohne Edit-Feld
Okay, so langsam dämmert es mir. Aber versuche mal den Beispielcode so einzufügen/bereitzustellen, dass die Ausführung per cut und paste gelingt. Du kannst Objekte in .show() und .hide() sichtbar machen und wieder verstecken.
Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassing, event handling, und so finden. Wichtig sind da noch die return codes aus den event handlern
Ja, ich habe die verschieden Versionen gesehen. Gerade deswegen bin ich verwirrt. Ich weiss nicht, wann ich die «__init__()» und «super()» Zeilen so leer lasse und wann bringe ich in «__init__» das Argument «parent=None» und «parent» in «Super().__init__(parent)». In verschiedenen Beispiele sind manchmal die eine Version in den anderen die andere Version oder sogar manchmal eine Kombination der beiden. Ich konnte daraus nicht schlau werden. Nirgendwo habe ich eine einfache klare Dokumentation bei meinen Google-Searches zu diesem Thema gefunden. Wie Du z. B. in Deinem Vorschlag erwähnt hast, warum soll ich den "init"-Part wegnehmen. Was hat das zur Folge, wenn es dadrin ist?
Daher meine Frage, ob jemand mir wirklich erklären kann, wann ich die Argument-Felder leer lasse und wann ich sie befüllen muss. Ich hoffe, dass mit oben gesagten / geschriebenen Du mein Problem besser verstehst und vielleicht mir eine Ausweg zeigst.
parent ermöglicht es, eine baumartige Eltern/Kind Beziehung zwischen Objekten (QObjects) aufzubauen. Anders als im echten Leben ist die Idee dabei, dass Kinder mit Ihren Eltern sterben. Wie im echten Leben hat diese Beziehung auch Seiteneffekte. Z.B, Du hast einen Dialog, der einen anderen Dialog aufruft. Wenn Du jetzt den Eltern-Dialog schließt und willst, dass der Kind-Dialog auch verschwindet, dann solltest Du dem Kind das parent-Argument mitgeben. Seiteneffekt ist dabei, dass der Kind-Dialog über dem Eltern-Dialog zentriert. Wichtig ist parent für von QObjects ableiteten Subklassen, um hier weiterhin eine explizite Eltern/Kind Beziehung zu erlauben/ermöglichen. Ziel ist dabei, Objekte so lange wie nötig und so kurz, wie möglich am Leben zu erhalten. Innerhalb von Dialogen/Composite Widgets z.B. wird heutzutage meistens eine implizite Beziehung über Layouts hergestellt. Aber wie im echten Leben wird das Beziehungsleben irgendwann kompliziert. Cheers, Pete

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_())

Mohsen Owzar schrieb am Samstag, 9. Oktober 2021 um 19:54:16 UTC+2: Hallo Hans-Peter Hier bin ich noch einmal. Wie Du unten siehst, hat es mit dem Einrücken nicht geklappt. Alles ist wieder linksbündig. Ich ahbe aber in meine E-Mail nachgesehen, die ich nach dem Posten erhalten habe. Da in dieser E-Mail sind die Einrückungen da. Ich weiss nicht. Vielleicht stelle ich mich so blöd an. Gruss Mohsen
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. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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)

Mohsen Owzar wrote on 09.10.21 20:07:
Alles ist wieder linksbündig. Ich ahbe aber in meine E-Mail nachgesehen, die ich nach dem Posten erhalten habe. Da in dieser E-Mail sind die Einrückungen da.
Bei mir kamen die Einrückungen auch korrekt an. Das hat also geklappt. :) Marco. -- k=bytes.fromhex('b90155033ce5a85fa989ed1d3adeaa6c82');c=bytes.fromhex('c9683b775184c61fcbe8867848bf8408e7');print(''.join([chr(c^k)for c,k in zip(c,k)]))

Am Samstag, 9. Oktober 2021, 19:54:15 CEST schrieb Mohsen Owzar:
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.
Eins nach dem anderen: talk with code --8<-- 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 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) central_widget = QWidget() 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) central_widget.setLayout(hbox) self.setCentralWidget(central_widget) 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() def closeEvent(self, event): self.keypad_window.close() super(MainWindow, self).closeEvent(event) @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.hide() 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_()) -->8-- Entspricht dies nun dem gewünschten Verhalten? Hier eine Erklärung: QMainWindows sind speziell im Umgang mit Widgets: https://doc.qt.io/qt-5/qmainwindow.html#qt-main-window-framework Wenn Qt so was raus haut, dann sollte man dem auf den Grund gehen: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout Du hättest einfach Dein CustomLineEdit als centralWidget setzen können. Um Dir aber die Übernahme in Dein tatsächliches Projekt zu Erleichtern, habe ich jetzt das line edit widget in ein container widget verfrachtet, in dem Du wie gewohnt (mit eigenen Layouts) schalten und walten kannst. Den __init__ code im CustomLineEdit brauchst Du nicht, da es Dir nur auf den event handler ankommt. Solltest Du eine __init__ Methode brauchen, würde ich mich immer am Original orientieren. Das würde dann so aussehen: def __init__(self, parent = None), oder def __init__(self, contents = "", parent = None) Eine dynamische Argumentliste, die das C++-Verhalten nachbildet, ist auch möglich, wird aber irgendwann kompliziert... Ich will die parent Diskussion nicht zu sehr ausweiten. Im Prinzip machst Du dies schon richtig im Keypad_Window, da dies hier ein Kind vom main window ist. Andererseits brauchst Du im main window sowieso eine andere close Implementierung, damit das Schließen des main window auch ein geöffnetes keypad widget schließt. Dann habe ich noch die show/hide Logik (hoffentlich) ein bisschen konsistenter gemacht. Die richtige Initialisierung des keypad Wertes beim wiederholten Aufruf überlasse ich Dir als Hausaufgabe.. Ich hoffe, das bringt Dich erst mal weiter. Rechnung folgt. ;-) Cheers, Pete

Hans-Peter Jansen schrieb am Sonntag, 10. Oktober 2021 um 18:39:52 UTC+2: Oh Manno Mann, Hans-Peter Ich weiss nicht, wie ich mich bei Dir bedanken kann? Wie die Schwizer sagen, ich bin Dir tuuusig Mal dankbar.
QMainWindows sind speziell im Umgang mit Widgets:
Wenn Qt so was raus haut, dann sollte man dem auf den Grund gehen: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
Das Verhalten Deiner geänderten Version ist genau das, was ich vorgehabt habe, zu programmieren und es mir nicht gelang. Aber wie sollte ich darauf kommen, dass bei QMainWindow der Hase ein bisschen anders läuft? Ohne Deine Erklärung wäre ich nicht in 1000 Jahre darauf gekommen. Ich programmiere mit Python seit etwa 10 Monaten. Manche Zusammenhänge sind mir noch nicht so ganz geläufig, wie die Sache mit Parent und Co. und jetzt QMainWindow Spezialitäten.
Die richtige Initialisierung des keypad Wertes beim wiederholten Aufruf überlasse ich Dir als Hausaufgabe..
Die richtige Initialisierung habe ich nicht verstanden, was Du damit meinst. Ich habe aber gesehen, wenn man auf das Feld geklickt hat und das Keypyd-Fenster geöffnet wurde, kann man noch einmal in das Feld klicken und dort auch noch Character mit dem normalen Keyboard eintippen, was nicht der Sinn der Sache ist. Daher habe ich in der Metode "show_keypad_window" das Edit-Feld mit "self.cle.setReadOnly(True)" gesperrt und bei "closeEvent" wieder freigegeben. Ich denke, dass ich damit diesen Fehler behoben habe. Ich muss noch weitere Tests durchführen, um vielleicht eine nicht geddachte Version zu erwischen.
Ich hoffe, das bringt Dich erst mal weiter.
Nicht nur weitergebracht, sondern auch die Augen geöffnet. Vieeeelen Dank!
Rechnung folgt. ;-)
Oh Oh, damit hatte ich nicht gerechnet:-) Gruss Mohsen

Am Sonntag, 10. Oktober 2021, 22:36:40 CEST schrieb Mohsen Owzar:
Hans-Peter Jansen schrieb am Sonntag, 10. Oktober 2021 um 18:39:52 UTC+2:
Oh Manno Mann, Hans-Peter Ich weiss nicht, wie ich mich bei Dir bedanken kann? Wie die Schwizer sagen, ich bin Dir tuuusig Mal dankbar.
Oh, ein Schwizer. Grüezi. Ist Schwizer Dütsch jetzt eine Fremdsprache oder nicht? Für mich als Rheinländer ist das schwer zu sagen. ;-)
QMainWindows sind speziell im Umgang mit Widgets:
Wenn Qt so was raus haut, dann sollte man dem auf den Grund gehen: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout Das Verhalten Deiner geänderten Version ist genau das, was ich vorgehabt habe, zu programmieren und es mir nicht gelang.
Na, das ist doch schon mal großartig, und es freut mich, geholfen zu haben.
Aber wie sollte ich darauf kommen, dass bei QMainWindow der Hase ein bisschen anders läuft? Ohne Deine Erklärung wäre ich nicht in 1000 Jahre darauf gekommen. Ich programmiere mit Python seit etwa 10 Monaten.
Na ja, die Qt-Klassenbibliothek ist so mächtig und umfangreich, das wundert mich nicht. Python selbst ist ja schon anspruchsvoll, aber wenigstens sind die Grundkonzepte eingängig und viele Sprachelemente sehr mächtig. Wenn jetzt aber auch Qt mit fast 2000 Klassen(!) hinzukommt, wird's, ähem, interessant. Das erschließt sich nicht in kurzer Zeit. Ich verfolge die Entwicklung von PyQt seit 2001 (kein Witz), kannst ja mal ein grep meines Namens in den examples machen... Wichtig ist, die originale C++ Doku lesen zu können, mit der Zeit lernt man, die wesentlichen Informationen herauszufiltern, das ganze C++ Brimborium zu ignorieren, und ein paar grundsätzliche Unterschiede aufzulösen (Argument mit address of value -> Mehrfachwert Rückgabe in Python, etc..).
Manche Zusammenhänge sind mir noch nicht so ganz geläufig, wie die Sache mit Parent und Co. und jetzt QMainWindow Spezialitäten.
Die richtige Initialisierung des keypad Wertes beim wiederholten Aufruf überlasse ich Dir als Hausaufgabe..
Die richtige Initialisierung habe ich nicht verstanden, was Du damit meinst.
Wenn Du schon einen Wert im line edit stehen hast, sollte dieser immer ins keypad übernommen werden, sodass der user immer den aktuellen Wert bearbeiten kann.
Ich habe aber gesehen, wenn man auf das Feld geklickt hat und das Keypyd-Fenster geöffnet wurde, kann man noch einmal in das Feld klicken und dort auch noch Character mit dem normalen Keyboard eintippen, was nicht der Sinn der Sache ist. Daher habe ich in der Metode "show_keypad_window" das Edit-Feld mit "self.cle.setReadOnly(True)" gesperrt und bei "closeEvent" wieder freigegeben.
Entweder würde ich das keypad modal machen, dann kannst Du aber immer einen Wert bearbeiten oder mit signals und slots beide Werte simultan aktuell halten.
Ich denke, dass ich damit diesen Fehler behoben habe. Ich muss noch weitere Tests durchführen, um vielleicht eine nicht geddachte Version zu erwischen.
Ich hoffe, das bringt Dich erst mal weiter.
Nicht nur weitergebracht, sondern auch die Augen geöffnet. Vieeeelen Dank!
Aber gerne doch. Bis denne, hp

Oh, ein Schwizer. Grüezi. Ist Schwizer Dütsch jetzt eine Fremdsprache oder nicht? Für mich als Rheinländer ist das schwer zu sagen. ;-)
Eigentlich bin ich Iraner. Ich habe aber 22 Jahre in Berlin gelebt und seit 2000 bin ich in der Schweiz. Ich habe auch meine Probleme, Schwitz_Deütsch zu verstehen.
Wichtig ist, die originale C++ Doku lesen zu können, mit der Zeit lernt man, die wesentlichen Informationen herauszufiltern, das ganze C++ Brimborium zu ignorieren, und ein paar grundsätzliche Unterschiede aufzulösen (Argument mit address of value -> Mehrfachwert Rückgabe in Python, etc..).
Ja, das ist das Problem. Ich habe auch C oder C++ vor einigen Jahren programmiert. Aber darin bin ich auch nicht so gut und wenn man in Python benutzen möchte (Qt-Manuals), wird man ganz durcheinander.
Wenn Du schon einen Wert im line edit stehen hast, sollte dieser immer ins keypad übernommen werden, sodass der user immer den aktuellen Wert bearbeiten kann.
Ja, da hast Du recht.
Entweder würde ich das keypad modal machen, dann kannst Du aber immer einen Wert bearbeiten oder mit signals und slots beide Werte simultan aktuell halten.
Ja mit modal vielleicht ist am besten. Aber ich denke, dass das nicht das Problem war. Ich habe dieses Keypad so schnell geschrieben, damit ich irgendwas in das Feld eintippen kann. Und als es mit der Anzeigen vom Edit-Feld schiefging, war ich total erschöpft und am Ende. Ich bedanke mich wirklich für Deine Geduld und gute Erklärungskünste. Liebe Grüsse Mohsen
participants (4)
-
Hans-Peter Jansen
-
Lars Liedtke
-
Marco Bakera
-
Mohsen Owzar