2012-12-31 28 views
0

我正在用wxrichtextctrl開發一個小應用程序。我的字體功能出乎意料地行事。以下是字體功能。wxrichtextctrl字體對話框

def OnFont(self,event): 
     if not self.display.HasSelection(): 
      return 
     r = self.display.GetSelectionRange() 
     fontData = wx.FontData() 
     fontData.EnableEffects(False) 
     attr = wx.richtext.RichTextAttr() 
     attr.SetFlags(wx.TEXT_ATTR_FONT) 
     dlg = wx.FontDialog(self, fontData) 
     if dlg.ShowModal() == wx.ID_OK: 
     fontData = dlg.GetFontData() 
     font = fontData.GetChosenFont() 
     color=fontData.GetChosenColor() 
     if font: 
      attr.SetFlags(wx.TEXT_ATTR_FONT) 
      attr.SetFont(font) 
      self.display.SetStyle(r, attr) 
     dlg.Destroy() 

這樣做的問題是,如果所選文本帶下劃線且設置了某種字體,則會刪除下劃線。是否有任何方法讓對話框只修改選擇存在的字體,而不是更改文本重量,下劃線和斜體。或者,這可能與richtextformatting對話框。或者是否可以修改對角線以僅顯示選擇的字體和大小選項並修改選定的文本。有人可以指出一個很好的示例文檔。

已更新: 我能夠爲對話框設置預定義字體,但問題是獲取所選文本的字體值。我正在嘗試的是獲取選區中第一個字符的樣式,並將其設置爲字體對話框,包括下劃線,字體,粗體,斜體和大小。 下面是我試圖做的代碼。

attr = wx.richtext.RichTextAttr() 
    attr.SetFlags(wx.TEXT_ATTR_FONT) 
    fontofselection=self.richtextctrl.GetStyle(1,attr)#this works without errors 
    fontData.SetInitialFont(fontofselection)#this generates above mentioned error. probably because getstyle is not getting font object type. Is there another method to get font of a character at particular position. 

回答

1

我不確定您可以使用默認的FontDialog來禁用/啓用某些字段。它是如此。但是,您可以選擇將其預設爲某個值並/或忽略某些值。

要做到這一點,您可以將data參數傳遞給dialog constructor。你必須自己構造FontData對象並將其傳遞給對話框。這件作品的示例代碼從Mouse vs. Python博客採取:

data = wx.FontData() 
data.EnableEffects(True) 
data.SetColour(self.curClr)   # set colour 
data.SetInitialFont(self.curFont) 

dlg = wx.FontDialog(self, data) 

檢查文章更完整的示例。另請參閱FontData對象的文檔以瞭解如何構建它並對其進行操作。

或者,您可以使用不太友好的對話框(IMO)FontEnumerator。在同一個博客上也是另一個great example。你也可以得到你需要的所有字體和/或其他參數的列表,並讓你自己Dialog

更新

要在特定位置獲得從文本正確的數據,您需要使用GetStyleGetStyleForRange,但你使用它錯了。如果您閱讀文檔,則會注意到這些成功返回True或失敗返回False,並且您應該使用attr獲得結果。例如:

attr = wx.richtext.RichTextAttr() 
attr.SetFlags(wx.TEXT_ATTR_FONT) 
success=self.richtextctrl.GetStyle(1,attr) 
fontData.SetInitialFont(attr.GetFont()) # And extract any other information from there 

請注意,這未經測試,但應按預期工作。

請檢查docsRichTextAttr,看看你可以從那裏提取什麼。我覺得下劃線/粗體/斜體是所有的字體對象:檢查GetUnderlinedGetWeightGetStyle(連同其各自制定者

經常檢查文檔,你會發現你的答案在不到一個小時:)

+0

我需要一點幫助。我嘗試使用font = self.display.GetStyle(1,attr)獲取位置爲1的文本的字體,其中attr和display在我的問題中定義在上面。但是,當我使用數據設置保存在getstyle中的字體時。setinitialfont(font),它表示wxfontconstant類型的預期參數。我的問題是我需要將選擇的字體設置爲字體對話框,包括在上面的下劃線和顏色 – MYNE

+0

上它說預期的參數兩種類型wxfontconstant。有沒有更好的方式獲取字體,包括選擇下劃線,以及上述解決方案如何在字體對話框中勾選下劃線。 – MYNE

+1

有一種名爲[wx.Font.SetUnderlined]的方法(http://wxpython.org/docs/api/wx.Font-class.html#SetUnderlined)。通常情況下,如果你從控制中獲得它,它應該已經被設置,我猜。另外,我找不到有關'wxFontConstant'的任何文檔。你可以用你的新代碼編輯你的問題嗎?只是一個簡單的例子,所以我可以看到你正在得到什麼.. – jadkik94