Slot parameter haben den Typ nicht die Values

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
bitmastah
User
Beiträge: 6
Registriert: Donnerstag 19. März 2020, 15:19

Hi euch draußen an den Kisten,

die Situation ist folgende:
python 3.5, pyqt5

Das Signal wird emitiert, der Slot wird aufgerufen,
aber die Ausgabe in der Message Box ist:

Code: Alles auswählen

+-------------------------------------------+
| my msg_box                                |
+-------------------------------------------+
|                                           |
|  my strings: <class 'str'> <class 'str'>  |
|                                           |
|                                +------+   |
|                                |  OK  |   |
|                                +------+   |
|                                           |
+-------------------------------------------+
Warum? :oops:

BeispielCode: (sollte laufen, wenn ich mich nicht vertippt hab. typos dürfen behalten werden)

Ich dank euch schon mal für eure Zeit und vielleicht auch einen Hinweis...

bitmastah

signal_sender.py

Code: Alles auswählen

# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# author: bitmastah
# -----------------------------------------------------------------------------

from PyQt5 import QObject, pyqtSignal
from PyQt5.QtWidgets import QMessageBox

class SignalSender(QObject):
  my_signal = pyqtSignal(str, str, name="my_signal")
  
  def __init__(self):
    super().__init__()
    self.my_signal.emit("test1", "test2")
main_window.py

Code: Alles auswählen

# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# author: bitmastah
# -----------------------------------------------------------------------------
import PyQt5.QtCore
import PyQt5.QtGui
import PyQt5.QtWidgets

from signal_sender import SignalSender

class MainWindow(PyQt5.QtWidgets.QMainWindow):
  def __init__(self):
    super(MainWindow, self).__init__()
    
    self.my_signal_sender_object = SignalSender()
    self.my_signal_sender_object.my_signal.connect(self.my_slot(str, str))
  
  @PyQt5.QtCore.pyqtSlot(str, str)
  def my_slot(self, msg1, msg2):
    msg_box = QMessageBox()
    msg_box.setText("my strings: {} {}".format(msg1, msg2))
    msg_box.exec()
Days of coding saves you hours of planing
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du rufst my_slot *auf*, und das mit zwei str-Typ-Objekten als Argument. Dieser Aufruf muss aus der Verbindung *raus*. Slots bekommen ueblicherweise keine Signatur, das ist nur fuer Signale (in Python jedenfalls) relevant. Entferne also einfach (str, str) und dann sollte der Teil zumindest gegessen sein. Schlechte Bezeichner wie "my_" oder numerierte Namen (msg1, msg2) sollten auch nicht sein.
Benutzeravatar
bitmastah
User
Beiträge: 6
Registriert: Donnerstag 19. März 2020, 15:19

Hi danke für deine Antwort _deets__

das mit der Benamsung ist zur Kenntnis genommen und ich gelobe feierlich Besserung. Aber als extrahierter Beispielcode... da hab ichs mit PEP8 nicht so genau genommen...

habe folgendes probiert:
self.my_signal_sender_object.my_signal.connect(self.my_slot()) --> error_slot() missing 2 required positional arguments msg1 and msg2
self.my_signal_sender_object.my_signal.connect(self.my_slot) --> der Slot wird nicht aufgerufen.
Days of coding saves you hours of planing
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die zweite Form ist die richtige, und natuerlich wird in dem Moment der Slot nicht aufgerufen. Warum sollte er? Dazu muss das my_signal feuern. Tut es das? Und warum heisst bei dir alles my?
Benutzeravatar
bitmastah
User
Beiträge: 6
Registriert: Donnerstag 19. März 2020, 15:19

Ist so ne Unart wenn ich Beispielcode schreibe. Sorry nochmal dafür. Ich hoff damit sind wir dann durch. Mea Culpa!

In signal_sender.py wird doch self.my_signal.emit("test1", "test2") gemacht. was wahrscheinlich zu früh ist, weil das schon im __init__ passiert und da der slot noch nicht verbunden ist.
werd ich nachher mal ausprobieren.

Erst mal vielen Dank. Ich geb dann Bescheid, wenns geht. :-)

bitmastah
Days of coding saves you hours of planing
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist dann zu frueh, ja.
Benutzeravatar
bitmastah
User
Beiträge: 6
Registriert: Donnerstag 19. März 2020, 15:19

Hallo __deets__,

läuft, wenn das event später gefeuert wird.

Nochmal danke
bitmastah
Days of coding saves you hours of planing
Antworten