Standardproblem: "externe" Variable bearbeiten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
max2

Donnerstag 25. November 2004, 12:49

Hallo,

ich möchte mit PyQt eine Variable auch durch ein Unterfenster bearbeiten können. Muss ich dazu das Unterfenster extra von der Qt-Klasse ableiten und eine Referenz auf die Variable in def __init__() übergeben oder gibt es einen einfachen Export-Mechanismus? Kleines Beispiel:

parentwindow.py:

Code: Alles auswählen

import sys
from qt import *
from childwindow import ChildWindow

class ParentWindow(QMainWindow):
    def __init__(self,parent = None,name = None,fl = 0):
        QMainWindow.__init__(self,parent,name,fl)
        self.setCaption("parent")
        if not name:
            self.setName("parent")
        self.setCentralWidget(QWidget(self,"qt_central_widget"))
        self.startChildButton= QPushButton(self.centralWidget(),"startChildbutton")
        self.startChildButton.setText("start child")
        self.startChildButton.setGeometry(QRect(350,60,151,41))
        self.parentIncreaseButton = QPushButton(self.centralWidget(),"parentIncreaseButton")
        self.parentIncreaseButton.setText("increase")
        self.parentIncreaseButton.setGeometry(QRect(80,60,151,41))
        self.resize(QSize(600,179).expandedTo(self.minimumSizeHint()))
        self.connect(self.parentIncreaseButton,SIGNAL("released()"),self.parentIncrease)
        self.connect(self.startChildButton,SIGNAL("released()"),self.startChildWindow)

    def parentIncrease(self):
        global counter
        counter += 1
        print"parentIncrease(): counter is ", counter
     
    def startChildWindow(self):
        cw = ChildWindow()
        cw.show()
        cw.exec_loop()

if __name__ == "__main__":
    counter = 0
    app = QApplication(sys.argv)
    QObject.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()"))
    pw = ParentWindow()
    app.setMainWidget(pw)
    pw.show()
    app.exec_loop()

childwindow.py:

Code: Alles auswählen

from qt import *

class ChildWindow(QWidget):
    def __init__(self,parent = None,name = None,fl = 0):
        QWidget.__init__(self,parent,name,fl)
        self.setCaption("child")
        if not name:
            self.setName("childwindow")
        self.childIncreaseButton = QPushButton(self,"childIncreaseButton")
        self.childIncreaseButton.setText("increase")
        self.childIncreaseButton.setGeometry(QRect(220,80,151,41))
        self.resize(QSize(600,179).expandedTo(self.minimumSizeHint()))
        self.connect(self.childIncreaseButton,SIGNAL("released()"),self.childIncrease)

    def childIncrease(self):
        global counter        # bleibt unbekannt :-(
        counter += 1
        print"childIncrease(): counter is ", counter
Das Hochzählen im Childwindow funktioniert nicht, die Variable ist unbekannt. Oder ist das Parentwindow/Childwindow-Konstrukt falsch? Wer weiß wie's geht?, danke im voraus.
max
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 25. November 2004, 13:56

Hi max2,

ich sehe 2 Möglichkeiten. 1. du verwendest ein Modul in welchem du ein Dictionary hast, das die globalen Werte enthält

Code: Alles auswählen

# Modul mit globalen Werten
glob = {"counter" : 0}
Dieses kannst Du überall importieren und dann die Einträge von glob manipulieren.

Oder du machst aus counter ein Attribut von ParentWindow, also in __init__ von parentwindow self.counter = 0 dann kannst Du im childwindow mit self.parent.counter auf den Counter zugreifen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
max2

Donnerstag 25. November 2004, 14:33

Dookie, Du bist ein Held!, danke für die schnelle Antwort. Das Importieren eines Modules, welches die globalen Variablen enthält, funktioniert prima.
Grüße aus Berlin
max
Antworten