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

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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 :)
Zuletzt geändert von name am Sonntag 28. Januar 2007, 12:40, insgesamt 1-mal geändert.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leerzeilen und PEP8 sind nicht dein Ding oder?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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..
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ja, schon viel besser :) Werde mir deinen Code gleich kopieren und dann mal schauen ob ich dem Problem auf die schliche komme.

lg
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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..
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ich suche parallel auch mal weiter. Wenn ich was finde melde ich mich. Vielleicht ist das schon in einer Mailingliste bekannt.

lg
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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? ^^
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Antworten