no attribute encoding

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
marcelr
User
Beiträge: 38
Registriert: Dienstag 19. August 2008, 09:34

Hallo,

ich versuche gerade in eine wxPython-GUI eine Anmeldung auf einen WebDAV-Server einzubauen und habe ein Problem mit den Encodings anscheinend... ich habe ein Feld, in dem ich mein Passwort eingebe und eins für den Username. Die Funktionen sind richtig, da sie ohne GUI via Terminal funktioniert haben. Ich bekomme aber jetzt folgende Fehlermeldung:

1587 in _setSessionInformation
AttributeError: PyOnDemandOutputWindow instance has no attribute 'encoding'

die betreffenden Zeilen in jener Funktion lauten:

Code: Alles auswählen

encoding = sys.stdout.encoding or sys.getfilesystemencoding()
        userName = userName.encode(encoding)
        password = password.encode(encoding)
Ich darf leider nichts in der _setSessionInformation Methode ändern, also hoffe ich, dass mir jemand mit dem Lösungsweg helfen kann.


Hier noch die Klasse, mit der ich den Login baue und wie ich ihn aufrufe:

Code: Alles auswählen

class UserLogin(wx.Dialog):
    def __init__(
            self, parent, ID, title, size=wx.DefaultSize, pos=wx.DefaultPosition, 
            style=wx.DEFAULT_DIALOG_STYLE,
            useMetal=False,
            ):
        
        wx.Dialog.__init__(self,parent)

        sizer = wx.BoxSizer(wx.VERTICAL)

        label = wx.StaticText(self, -1, "Benutzer und Passwort fuer den WebDAV-Server:")
        sizer.Add(label, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        box = wx.BoxSizer(wx.HORIZONTAL)
        label = wx.StaticText(self, -1, "Benutzer: ")
        box.Add(label, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        text = wx.TextCtrl(self, -1, "", size=(80,-1), name="user")
        box.Add(text, 1, wx.ALIGN_CENTRE|wx.ALL, 5)
        sizer.Add(box, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        box = wx.BoxSizer(wx.HORIZONTAL)
        label = wx.StaticText(self, -1, "Passwort: ")     
        box.Add(label, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        text1 = wx.TextCtrl(self, -1, "", size=(80,-1),style=wx.TE_PASSWORD, name = "password")        
        box.Add(text1, 1, wx.ALIGN_CENTRE|wx.ALL, 5)
        sizer.Add(box, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL)
        sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5)
        btnsizer = wx.StdDialogButtonSizer()
        
        btn = wx.Button(self, wx.ID_OK)
        btn.SetDefault()
        btnsizer.AddButton(btn)

        btn = wx.Button(self, wx.ID_CANCEL, "Abbrechen")
        btnsizer.AddButton(btn)
        btnsizer.Realize()

        sizer.Add(btnsizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)

        self.SetSizer(sizer)
        sizer.Fit(self)
der Aufruf:

Code: Alles auswählen

dlg = verifyUser.UserLogin(self, -1, "Login")
            dlg.CenterOnScreen()
            val = dlg.ShowModal()
    
            if val == wx.ID_OK:
                print 'ok'
                userName=dlg.FindWindowByName("user").GetValue()
                password = dlg.FindWindowByName("password").GetValue()
                
                collectionHandle.loginUser(userName, password)
marcelr
User
Beiträge: 38
Registriert: Dienstag 19. August 2008, 09:34

Hab herausgefunden, dass allein das

Code: Alles auswählen

sys.stdout.encoding
den Fehler verursacht. Bei Aufruf der Funktion wird folgendes ausgeführt:

Code: Alles auswählen

encoding = sys.stdout.encoding or sys.getfilesystemencoding()
wie kann ich es abfangen, dass das 'sys.stdout.encoding' das Programm beendet? das sys.getfilesystemencoding funktioniert ja.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

marcelr hat geschrieben:Hab herausgefunden, dass allein das

Code: Alles auswählen

sys.stdout.encoding
den Fehler verursacht. Bei Aufruf der Funktion wird folgendes ausgeführt:

Code: Alles auswählen

encoding = sys.stdout.encoding or sys.getfilesystemencoding()
wie kann ich es abfangen, dass das 'sys.stdout.encoding' das Programm beendet? das sys.getfilesystemencoding funktioniert ja.
Äh ... wie wärs mit weglassen? ;-)
Ansonsten könntest du die Exception ja auch abfangen mit try .... except.
marcelr
User
Beiträge: 38
Registriert: Dienstag 19. August 2008, 09:34

weglassen geht nicht, da ich dieses Lib nicht verändern darf. wenn ich es mit try..except mache, hört er ja auf mit dieser Methode und ich komme nicht weiter.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Eine dirty-Lösung wäre, das Attribut einfach zu setzen ;-) Aber das wäre imho ziemlich dirrrty!

Naja, wie stellst Du Dir das vor? Du benutzt ein Modul, das sich so nicht einbauen lässt, weil es gegen gewisse Fälle nicht gewappnet ist (keine Ahnung ob man nun dem Modul Schuld geben kann oder nicht - ist hier aber auch irrelevant). Du willst es aber auf Gedeih und Verderb benutzen! Ändern daran darfst Du auch nichts ....

Also wie soll das gehen?
marcelr
User
Beiträge: 38
Registriert: Dienstag 19. August 2008, 09:34

Tja, genau das ist mein Problem...
Mir bleibt wohl nichts anderes übrig, als es auf None zu setzen; sowas mag ich gar nicht.
BlackJack

Dann behebe den Fehler in der Bibliothek und reich das als Patch beim Autor ein. Einen Fehler nicht zu beheben obwohl man den Quelltext hat und stattdessen Hacks zum Umgehen zu verwenden muss ja nicht sein.
Antworten