RichTextCtrl

Plattformunabhängige GUIs mit wxWidgets.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 24. Dezember 2008, 00:01

Hallo,

ich versuche gerdade eine Art Editor zu basteln, scheitere aber daran einem bestimmten Textbereich eine Schriftart zuzuweisen.

http://paste.pocoo.org/show/96575/

Das ist mein derzeitiges Skript - in EditorToolBar.handle_font ist das Problem. Wie kann ich das lösen? Eine ähnliche Funktion wie ApplyUnderlineToSelection() gibt es ja für Font nicht.

Dann wollte ich noch fragen, wie man das am schlauesten mit den IDs und Konstanten löst. Momentan habe ich die IDs (BOLD, ITALOC etc.) ja in der Klasse definiert und SIZER_BORDER auch. Soll ich diese besser global definieren oder wie macht ihr das?

Danke!
MfG
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Mittwoch 24. Dezember 2008, 09:16

Moin, ich habs selber noch nicht versucht was du vorhast. Aber hast du schon mal einen Blick in die wx demos geworfen? Die demo 'RichTextCtrl.py' macht genau das was du dir bauen willst. Da müsstest du eigentlich fündig werden.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 24. Dezember 2008, 10:16

Super, danke! Eigentlich hatte ich da als erstes gesucht - aber nichts gefunden...

Code: Alles auswählen

def handle_font(self, event):
    if not self.editor.HasSelection():
        return
    selection = self.editor.GetSelectionRange()
    font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL, False,
        u'Comic Sans MS')
    attr = wx.richtext.TextAttrEx()
    #self.editor.GetStyleForRange(selection, attr)
    attr.SetFlags(wx.richtext.TEXT_ATTR_FONT)
    attr.SetFont(font)
    self.editor.SetStyle(selection, attr)
Das Problem hier bei ist, dass ich immer die alte Formatierung verliere (bold, italic...) - wie kann ich die alten Text-Eigenschaften beibehalten und nur die Schriftart ändern? (ich habe es schon mit der auskommentierten Zeile probiert) Ich überschreibe es ja immer mit dem Font-Objekt, da müsste man irgendwie die alten Werte wieder übernehmen...

Problem gelöst:

Code: Alles auswählen

def handle_font(self, event):
    if not self.editor.HasSelection():
        return
    selection = self.editor.GetSelectionRange()
    attr = wx.richtext.TextAttrEx()
    self.editor.GetStyleForRange(selection, attr)
    attr.SetFontFaceName(u'Comic Sans MS')
    self.editor.SetStyle(selection, attr)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 24. Dezember 2008, 15:39

Jetzt habe ich ein komisches Problem:

Code: Alles auswählen

class FontChoice(wx.ComboBox):
    def __init__(self, parent, editor):
        f = wx.FontEnumerator()
        f.EnumerateFacenames()
        font_list = f.GetFacenames()
        wx.ComboBox.__init__(self, parent, -1, size=(120,-1), choices=font_list,
            style=wx.CB_DROPDOWN|wx.CB_SORT)
        self.editor = editor
        self.Bind(wx.EVT_COMBOBOX, self.handle_font)
        
    def handle_font(self, event):
        selection_range = self.editor.GetSelectionRange()
        print selection_range
        attr = wx.richtext.TextAttrEx()
        self.editor.GetStyleForRange(selection_range, attr)
        font_choice = self.GetStringSelection()
        attr.SetFontFaceName(font_choice)
        if self.editor.HasSelection():
            self.editor.SetStyle(selection_range, attr)
Man sollte ja annehmen, dass die Schriftart nur für "SelectionRange" geändert wird - leider wird relativ willkürlich die Schriftart geändert. Woran kann das liegen?
Antworten