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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.