PyQt - benutzerdefinierte Funktion

Gast #4196623
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_() )
Gast #4196752
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ß
#4197321
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren