Seite 1 von 1

[wx.lib.iewin.IEHtmlWindow] Problem mit Fokus!

Verfasst: Sonntag 28. Januar 2007, 00:42
von name
Hab' heute einen on-the-fly HTML Editor geschrieben, weil der wx.html.HtmlWindow Parser einfach nur schrott ist, habe ich den 'wx.lib.iewin.IEHtmlWindow' genommen, nur das Problem ist, nachdem der einmal den Fokus bekommen hat(Klick oder anderes), kann ich ich dem anderen TextCtrl nur jeweils eine Character tippen kann, und OnBrowserFocus() wird NIE ausgefuehrt, mit dem 'wx.html.HtmlWindow' ist das aber kein Problem.
Ich hab echt keine Idee was das sein koennte, danke fuer die Hilfe!


Hier der Sourcecode:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import sys
import copy
print "Using wxPython %s" % wx.__version__
if int(wx.__version__.split(".")[1]) < 4:
    print "Get a newer version of wxPython"
if not "win" in sys.platform.lower():

    win = False
    import wx.html
else:
    Warning("Don't click into the browser window, it will cause a bug!\
    \nClicking links will cause it as well!")
    import wx.lib.iewin
    win = True
def NotImplemented(event=None):
    dlg = wx.MessageDialog(None, "This feature is not yet implemented", "Feature not available", wx.OK | wx.ICON_INFORMATION)
    dlg.ShowModal()
def Warning(text, event=None):
    dlg = wx.MessageDialog(None, text, "WARNING", wx.OK | wx.ICON_WARNING)
    dlg.ShowModal()
class MyFrame(wx.Frame):
    def __init__(self):
        self.filename = ""
        self.opencopy = ""
        # begin wxGlade: MyFrame.__init__
        wx.Frame.__init__(self, parent=None, id=-1, title="wxHTML - The on-the-fly HTML editor!", pos=(0, 0), size=(800, 600))
        if win:
           Warning("Don't click into the browser window, it will cause a bug!\
           \nClicking links will cause it as well!")
        else:
           Warning("Non-windows systems may have worse HTML parsing, sorry")
        self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER)
        self.text_ctrl_1 = wx.TextCtrl(self.window_1, -1, "", style=wx.TE_MULTILINE)
        if win:
            self.window_2 = wx.lib.iewin.IEHtmlWindow(self.window_1, -1)
            self.window_2.LoadString("")
        else:
            self.window_2 = wx.html.HtmlWindow(self.window_1, -1)
        self.text_ctrl_1.Bind(wx.EVT_TEXT, self.ChangeText)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.__do_layout()
        self.__doMenus()
        self.SetSize((800, 600))
        #self.window_2.GoBack()
        # end wxGlade
        self.window_2.Bind(wx.EVT_SET_FOCUS, self.OnBrowserFocus)


    def OnBrowserFocus(self, evt=None):
        print "Browser got focus"
        self.text_ctrl_1.SetFocus()


    def OpenUrl(self, evt=None):
        NotImplemented()
        pass


    def OnBack(self, evt=None):
        #self.window_2.GoBack()
        self.ChangeText()
        #self.text_ctrl_1.SetFocus()


    def ChangeText(self, evt=None):
        #self.window_2.SetPage(self.text_ctrl_1.GetValue())
        if win:
            self.window_2.LoadString(self.text_ctrl_1.GetValue())
        else:
            self.window_2.SetPage(self.text_ctrl_1.GetValue())
        self.text_ctrl_1.SetFocus()


    def __doMenus(self):

        """ Menu things starting """
        menuBar = wx.MenuBar()
        menu1 = wx.Menu()
        menu1itmes = list()
        menu1itmes.append(menu1.Append(-1, "&Open"))
        menu1itmes.append(menu1.Append(-1, "&Save"))
        menu1itmes.append(menu1.Append(-1, "E&xit"))
        menu3 = wx.Menu()
        menu3itmes = list()
        menu3itmes.append(menu3.Append(-1, "&Back to your HTML"))
        menu3itmes.append(menu3.Append(-1, "Open &Url"))
        menu2 = wx.Menu()
        menu2itmes = list()
        menu2itmes.append(menu2.Append(-1, "&About"))
        menuBar.Append(menu1, "&File")
        menuBar.Append(menu2, "&Help")
        menuBar.Append(menu3, "&Browser")
        self.Bind(wx.EVT_MENU, self.OnOpen, menu1itmes[0])
        self.Bind(wx.EVT_MENU, self.OnSave, menu1itmes[1])
        self.Bind(wx.EVT_MENU, self.OnClose, menu1itmes[2])
        self.Bind(wx.EVT_MENU, self.OnAbout, menu2itmes[0])
        self.Bind(wx.EVT_MENU, self.OnBack, menu3itmes[0])
        self.Bind(wx.EVT_MENU, self.OpenUrl, menu3itmes[1])
        self.SetMenuBar(menuBar)
        """ Menu things done """


    def OnClose(self, evt=None):
        if self.opencopy != self.text_ctrl_1.GetValue():
            self.OnSave(text="You have unsaved changes")
        self.Destroy()


    def OnAbout(self, evt=None):
        pass


    def OnSave(self, event=None, text=None):
        if not text:
            text = "Choose file to save"
        else:
            text = text
        wildcard = "HTML files (*.html)|*.html|" \
        "HTML files (*.htm)|*.htm|" \
        "All files (*)|*|"
        filedia = wx.FileDialog (self
                                #,wildcard=wildcard
                                 , message=text, 
                                 style=wx.OVERWRITE_PROMPT | wx.SAVE, 
                                 defaultFile=self.filename)
        ret = filedia.ShowModal()
        print ret
        if ret != wx.ID_OK:
            return False
        #fo =  codecs.open(self.filedia.GetPath(), "w", "utf-8")
        fo = open(filedia.GetPath(), "w")
        fo.write(self.text_ctrl_1.GetValue())
        filedia.Destroy()


    def OnOpen(self, event=None):
        wildcard = "HTML files (*.html)|*.html|" \
        "HTML files (*.htm)|*.htm|" \
        "All files (*)|*|"

        filedia = wx.FileDialog(self, message="Choose the file to open", 
                                #wildcard=wildcard
                                )
        if not filedia.ShowModal() == wx.ID_OK:
            return False
        value = open(filedia.GetPath()).read()
        self.text_ctrl_1.SetValue(value)
        self.opencopy = copy.copy(value)
        self.filename = filedia.GetFilename()
        filedia.Destroy()


    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        self.window_1.SplitVertically(self.text_ctrl_1, self.window_2)
        sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        #self.Layout()
        # end wxGlade

# end of class MyFrame


if __name__ == "__main__":

    app = wx.PySimpleApp(0)
    frame_1 = MyFrame()
    frame_1.Show()
    app.SetTopWindow(frame_1)
    app.MainLoop()
Wer es bis hier geschafft hat, dem danke ich nochmal :)

Verfasst: Sonntag 28. Januar 2007, 10:24
von sape
Leerzeilen und PEP8 sind nicht dein Ding oder?

Verfasst: Sonntag 28. Januar 2007, 11:21
von sape
Zu deiner Frage:

Schau mal in Zeile 50:

Code: Alles auswählen

self.window_2.Bind(wx.EVT_SET_FOCUS, self.OnBrowserFocus) 
``OnBrowserFocus`` wird _immer_ für das rechte Fenster ausgeführt.

Ich würde ja gerne ne Lösung anbieten, aber ehrlich es macht kein Spaß sich durch deinen Code zu Quellen, weil
1. non-PEP8
2. Kein EOL79
3. Leerzeilen sind dir unbekannt. Nicht mal die Methodendefinitionen hast du mit eine Leerzeile getrennt.
4. Man kann keine zusammenhängenden Blöcke, mangels Trennung durch Leerzeilen, erfassen.
5. ...

http://www.python.org/dev/peps/pep-0008/
http://www.wxpython.org/codeguidelines.php
http://wiki.wxpython.org/index.cgi/wxPython_Style_Guide

lg

Verfasst: Sonntag 28. Januar 2007, 12:44
von name
Bist du jetzt wenigstens ein bisschen zufrieden?
Naja, mit dem IEHtmlWindow wird es NIE ausgefuehrt und mit dem HtmlWindow natuerlich dann wenn es Fokus bekommt, das is ja gerade das Problem..

Verfasst: Sonntag 28. Januar 2007, 12:54
von sape
Ja, schon viel besser :) Werde mir deinen Code gleich kopieren und dann mal schauen ob ich dem Problem auf die schliche komme.

lg

Verfasst: Sonntag 28. Januar 2007, 13:25
von name
Ich befuerchte das es ein bug in wxPython ist, weil mit dem wx.HtmlWindow gehts ja glatt, das ist aber, wie schon gesagt, Mist...
ah, BTW, unter windows verwende ich wxPython 2.8, falls das was zur sache tut

Verfasst: Sonntag 28. Januar 2007, 13:31
von sape
Ich befürchte auch das es ein Bug ist. Was mir ausfällt ist das es keine Doku zu ``wx.lib.iewin`` gibt: http://wxpython.wxcommunity.com/docs/ap ... odule.html

lg

P.S.: Ich verwende auch wxPython 2.8.

Verfasst: Sonntag 28. Januar 2007, 13:41
von name
sape hat geschrieben:Ich befürchte auch das es ein Bug ist. Was mir ausfällt ist das es keine Doku zu ``wx.lib.iewin`` gibt: http://wxpython.wxcommunity.com/docs/ap ... odule.html

lg

P.S.: Ich verwende auch wxPython 2.8.
Jo, das ist mir leider auch schon aufgefallen, vlt werde ich mal schauen obs mit 2.6 geht, naja, danke..

Verfasst: Sonntag 28. Januar 2007, 13:47
von sape
Ich suche parallel auch mal weiter. Wenn ich was finde melde ich mich. Vielleicht ist das schon in einer Mailingliste bekannt.

lg

Verfasst: Sonntag 28. Januar 2007, 16:18
von name
Die alte version (2.7) hat auch nichts gebracht, das Browser Widget unterstuetzt weder

Code: Alles auswählen

self.window_2.ScrollPages(1)
noch:

Code: Alles auswählen

self.window_2.ScrollLines(1)
Also fuer mich sieht dieses Widget sehr kaputt aus ;)
EDIT: Sehr sehr eigen, jetzt geht es, ich hab "app = wx.PySimpleApp(True)", d.h. ich hab den output forgewarded, und jetzt gehts ^^ Ok, es ist so, man muss auf das stdout/stderr Fenster klicken, dann geht alles normal, da haben die wxPython devs irgentwas gepfuscht

Verfasst: Sonntag 28. Januar 2007, 17:18
von sape
Hab nochmal mit google nach Infos gesucht und nichts brauchbares gefunden. Überhaupt sind zu ``wx.lib.iewin`` nicht viele Information im Netz zu finden.
[...] Ok, es ist so, man muss auf das stdout/stderr Fenster klicken, dann geht alles normal [...]
Keine schöne Lösung.

Verfasst: Sonntag 28. Januar 2007, 17:19
von name
sape hat geschrieben:Hab nochmal mit google nach Infos gesucht und nichts brauchbares gefunden. Überhaupt sind zu ``wx.lib.iewin`` nicht viele Information im Netz zu finden.
[...] Ok, es ist so, man muss auf das stdout/stderr Fenster klicken, dann geht alles normal [...]
Keine schöne Lösung.
Du hast ja so recht, aber besser als nix ist es, oder?
Das das scrollen im code nicht geht is auch total unschoen, wer hat den dieses Widget gemacht? ^^