Seite 1 von 1

RichTextCtrl

Verfasst: Mittwoch 24. Dezember 2008, 00:01
von nemomuk
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

Verfasst: Mittwoch 24. Dezember 2008, 09:16
von Lonestar
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.

Verfasst: Mittwoch 24. Dezember 2008, 10:16
von nemomuk
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)

Verfasst: Mittwoch 24. Dezember 2008, 15:39
von nemomuk
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?