Variablenfehler in Verbindung mit QInputDialog

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
PythonStümper
User
Beiträge: 3
Registriert: Freitag 29. Mai 2009, 16:28

Hallo Leute,

Ich rufe aus einem Fenster eine Dialogbox mittels QInputDialog auf:

Code: Alles auswählen

from PyQt4 import QtCore, QtGui
from abaquse_ui import Ui_ABAQuse as MainWin
import sys

class MeinWidget(QtGui.QMainWindow, MainWin):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.connect(self.actionSetdirectory, QtCore.SIGNAL("activated()"), self.setDirectory)  

# Action definition:
    def setDirectory(self):
        ok = True
        (dirname,ok) = QtGui.QInputDialog.getText(
            self,
            "ABAQuse log files Directory",
            "Enter new log file directory",
            QtGui.QLineEdit.Normal,logfiledir)
        if (ok and not dirname==""):
            test = str(dirname)
            print logfiledir,test
Die Variable logfiledir ist global definiert.

So weit funktioniert alles.
Wenn ich aber in der Funktion setDirectory die letzte Print-Anweisung durch eine Zuweisung ersetze:

Code: Alles auswählen

    def setDirectory(self):
        ok = True
        (dirname,ok) = QtGui.QInputDialog.getText(
            self,
            "ABAQuse log files Directory",
            "Enter new log file directory",
            QtGui.QLineEdit.Normal,logfiledir)
        if (ok and not dirname==""):
            test = str(dirname)
            logfiledir = test
bekomme ich die Fehlermeldung:

UnboundLocalError: local variable 'logfiledir' referenced before assignment

Kann mir die jemand erklären? Wenn ich beide Variablen ausgeben kann, sollte ich den Wert der Einen auch der anderen zuweisen können, oder?

Liebe Grüße
Ingo
lunar

Durch die Zuweisung überschreibst du den im globalen Namensraum vorhandenen Namen mit einem lokalen Namen. "logfiledir" in Zeile 9 wird also im lokalen Namensraum nachgeschlagen, wird aber erst in Zeile 12 gebunden. Um wirklich mit dem globalen Namen zu arbeiten, musst du die "global"-Anweisung verwenden. Das aber solltest du dir erst gar nicht angewöhnen, und derartige globale Namen lieber an der richtigen Stelle in einer Klasse kapseln.

Im Übrigen hat Qt4 auch Dialoge, die spezielle für die Auswahl eines Dateinamens oder eines Verzeichnisses da sind, ein QInputDialog ist dafür nämlich nicht die beste aller möglichen Lösungen.
Antworten