Forum: PC-Programmierung PyQt - benutzerdefinierte Funktion


von Slot (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei mich ein bisschen in die GUI-Programmierung mit 
Python 3 und PyQt5 einzuarbeiten. Mein Ziel ist es beim Druck auf einen 
Button zur Laufzeit einen neuen Eintrag in eine Combobox zu erstellen. 
Der Code ist unten zu sehen. Der Fehler liegt in der Funktion "addText", 
weil hier "combo" nicht gefunden werden kann. Ein Hinzufügen von "self." 
nutzt auch nicht. Wie bekomme ich die Verbindung zwischen Widget und 
Funktion hin?

Gruß
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
import sys
5
from PyQt5.QtWidgets import ( QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplication, QComboBox )
6
from PyQt5.QtCore import QCoreApplication
7
8
class Example( QWidget ):
9
    
10
    def __init__(self):
11
        super().__init__()
12
13
        self.initUI()
14
        
15
    def initUI(self):
16
       
17
        # Create buttons 
18
        okButton = QPushButton( "OK" )
19
        addButton = QPushButton( "add" )
20
        
21
        # connect to events to slots
22
        addButton.clicked.connect( self.addText )
23
        okButton.clicked.connect( QCoreApplication.instance().quit )
24
25
        combo = QComboBox( self )
26
        combo.addItem( "oben" )
27
        combo.addItem( "unten" )
28
29
        hbox = QHBoxLayout()
30
        hbox.addStretch( 1 )
31
        hbox.addWidget( okButton )
32
        hbox.addWidget( addButton )
33
34
        vbox = QVBoxLayout()
35
        vbox.addWidget( combo )
36
        vbox.addStretch( 1 )
37
        vbox.addLayout( hbox )
38
        
39
        self.setLayout( vbox )
40
        
41
        self.setGeometry( 300, 300, 300, 150 )
42
        self.setWindowTitle( 'Buttons' )    
43
        self.show()
44
45
    def addText( self ):
46
        combo.addItem( "neu" )
47
        
48
        
49
if __name__ == '__main__':
50
    
51
    app = QApplication( sys.argv )
52
    ex = Example()
53
    sys.exit( app.exec_() )

von self (Gast)


Lesenswert?

self.combo = QComboBox( self )
^^^^^

von Slot (Gast)


Lesenswert?

self schrieb:
> self.combo = QComboBox( self )
> ^^^^^

Okay, ich habe jetzt überall das "self" vor "combo" gesetzt und es 
funktioniert. Verstehen tue ich es leider noch nicht so ganz, da ich 
OOP-mäßig nicht ganz sattelfest bin (Klassen, Objekte, Vererbung, etc. 
sind mir bekannt aber nicht im Zusammenhang mit Python).

Was genau bewirkt das "self"
a) in der Methode initUI( self )?
b) beim Aufruf in der Methode addText( self )?

Insbesondere wieso ich das self bei initUI benötige verstehe ich nicht. 
Brauche ich ja bei den Buttons auch nicht..

Gruß

von Andreas R. (daybyter)


Lesenswert?

Ohne Ahnung von Python zu haben, würde ich mal vermuten, dass hier der 
this-Pointer übergeben wird (also ein Pointer auf die aktuelle Klasse).

von Rolf M. (rmagnus)


Lesenswert?

Andreas R. schrieb:
> this-Pointer übergeben wird (also ein Pointer auf die aktuelle Klasse).

Ein Pointer auf das aktuelle Objekt.

Slot schrieb:
> Verstehen tue ich es leider noch nicht so ganz, da ich OOP-mäßig nicht
> ganz sattelfest bin (Klassen, Objekte, Vererbung, etc. sind mir bekannt
> aber nicht im Zusammenhang mit Python).

Wenn dir Klassen und Objekte bekannt sind, sollte es doch recht einfach 
verständlich sein.

> Was genau bewirkt das "self"

Daß du auf ein Element deines Objekts zugreifst.

> a) in der Methode initUI( self )?
> b) beim Aufruf in der Methode addText( self )?
>
> Insbesondere wieso ich das self bei initUI benötige verstehe ich nicht.

Weil du damit dein Objekt initialisieren willst, nämlich das Objekt für 
das du addText aufrufst. Ohne das self gibt's kein Objekt.

> Brauche ich ja bei den Buttons auch nicht..

Naja, wenn du für die ganze Klasse Example genau einen Button willst, 
und nicht für jede Instanz davon, dann geht das so.

von zapotek (Gast)


Lesenswert?

Genauso ist es. "this" bzw. self muss in Python immer explixit angegeben 
werden, anders als z.B. bei C++.

von Kaj (Gast)


Lesenswert?

zapotek schrieb:
> "this" bzw. self muss in Python immer explixit angegeben
> werden, anders als z.B. bei C++.
Ja, das ist einer der Python-Grundsätze: "Explicit is better than 
implicit", was ich völlig richtig finde.

von Rolf M. (rmagnus)


Lesenswert?

Kaj schrieb:
> Ja, das ist einer der Python-Grundsätze: "Explicit is better than
> implicit"

Außer offenbar beim Erzeugen von Variablen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.