2010-01-16 57 views
2

嘿,夥計們,對不起,但這將是一個大的..;)wx.Font使用facename&PIL.ImageFont使用文件名...有什麼辦法可以將兩者聯繫起來?

我現在遇到了一個惱人的小障礙。我正在創建一個RSS風格的應用程序,將放置在整個辦公室的一些大型液晶顯示器上。基本的概念是有一個客戶端/服務器設置,用戶可以使用自定義編輯器來創建具有他們選擇的字體,重量,尺寸等的單個文章,然後將它們上傳到服務器(最初)會顯示文本在LCD屏幕上使用wx.TextCtrl & wx.TextAttr。

這裏就是我要瘋了..

我能夠順利創建客戶端/服務器,我可以獲取服務器的顯示器正常工作,但我無法找到一個方法來流文字從右到左不會造成任何閃爍。我們的顯示器是42英寸,我嘗試過使用相當多的方法來完成這個任務,但是這些顯示器所需的文字大小我似乎無法擺脫閃爍。

到目前爲止,我已經嘗試了三種方法來獲得在運動中的文字:)wx.Ticker(

這是一個似乎做的正是我一直在試圖控制:

方法1來完成,而當使用更小的字體時,它實際上就是我所需要的。問題是我們不能使用較小的字體,我們將使用的字體將會非常大,例如36,48,72等,並且在使用wxpython演示測試ticker時,我無法創建足夠平滑的效果來考慮這是一個可行的方法來完成我的任務,即使在調整了他們的代碼之後。

方法2:FadingTextCtrl()(自定義控制)

前陣子,和之前很久,我發現wx.Ticker,我創造了一個控制,以完成這一壯舉,我已經成功地使用其內以前的幾個項目。我基本上用EVT_TIMER設置了一個TextCtrl,將光標設置到行首,然後重複刪除文本的第一個字符,速度由EVT_TIMER控制。這令人驚訝地減少了閃爍的頻率,但是當它選擇閃爍時,它更明顯。另一個缺點是您需要使用固定寬度的字體以避免在刪除字符時出現跳動。如果沒有寬度固定的字體,由於寬度變化,某些字符的刪除速度會比其他字符更快,導致文字的移動速度隨機加快,從而無法準確控制速度。

方法3:wx.AnimatedCtrl()&自定義生成GIF動畫

這似乎是我最好的選擇至今。和我SOOOOOOOOO關閉!

使用PIL和一些隨機的片段,我可以通過Google找到,我已經能夠生成一個動畫GIF並將其放置在wx.AnimatedCtrl()中。在大屏幕上進行一些測試後,最終看起來像我的解決方案,因爲文本流沒有一個閃爍!在給gif添加了更多幀之後,我可以更順利地使用前面的任何方法移動文本。所以在這裏,沒有閃爍,完全平滑,然後最荒謬的衝突打我傻了......

在構建了一個適合按需創建我的圖像的函數之後,我回到我的GUI並開始鏈接所有控件,收集我的所有文本及其屬性以創建動畫GIF。我將這一切都推到我的功能,然後它告訴我,你將在wx中創建字體的方式與PIL的方式不同,更具體地說,您是如何指定計劃用於文本的字體。例如,wx.Font()使用字體的Facename來指定要使用的字體,其中PIL.ImageFont使用字體的路徑/文件名來選擇要繪製的字體。

你必須在開玩笑.....我現在離完成我的項目只有一步之遙,我沒有辦法與我的字體聯繫在一起。我可以推入剩餘的字體信息,但是我無法告訴PIL.ImageFont哪種字體可以與wx.Font()提供的字體數據一起使用。

最後,這裏是我的問題......我如何將wx.Font()的面名與其實際文件名相關聯,以便我可以找到一種方法來告訴PIL.ImageFont使用我用我定義的文本屬性控制?

我想我中獎了,昨晚當我發現註冊表項:

「HKLM \ SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \字體」

該項包含一串字符串定義窗口可用字體名稱的值,以及指向其文件的相關路徑。這與控制面板>>字體使用的信息相同,因此您會認爲這是我缺少的鏈接。我很快建立了另一個模塊來索引這些值併爲文本生成所選的面名/文件名。這似乎對TTF(TrueType)字體工作得很好。

,然後又打釘子..

大多數面名的使用多種字體文件產生類似的斜體,粗體等,但與wx.Font()似乎總是使用一個面名的字體效果,像「Tahoma」,並指定與其他參數,如風格,重量等影響。因此,對於Tahoma常規,你會使用字體文件「TAHOMA.TTF」,但使用Tahoma Bold你會使用字體文件「tahomabd。 TTF」。話雖如此,註冊表中找到的人臉名稱與wxPython中使用的人臉名稱不匹配。例如:Tahoma的regsitry facename可以是Tahoma(TrueType)或Tahoma Bold(True Type)的粗體,雖然wx.Font()只需要兩個「Tahoma」,它會匹配使用場景的相應字體文件您提供給控制的其他參數。很容易刪除註冊表人臉名稱中的垃圾文本,例如(TrueType)或(VGA res),但我仍然留下了多個用於某些字體的臉部名稱,這些字體不會飛行。

現在,這裏是我目前在哪裏。

我用PIL通過創建一個畫布,設置所有的文字創造我的gif動畫屬性

  1. 創建兩個列表,一個文本,一個爲每個文本項的屬性。例如:

    msgs = [「***」,「Header:」,「要打印到圖像文件的消息正文。還有什麼要說的?真的?!?!?!什麼是THERE ?!?」, 「***」]

    字體= [(font_bold_file,48, 「#000000」),(font_bold_file,48, 「#000000」),(font_norm_file,48, 「#000000」), (font_bold_file,48,「#000000」)]

  2. 創建空白畫布,

  3. 迭代通過列表加倍文本程度的寬度,寫在畫布上的文字,右對齊,稍將文本的posX移動到每幀左邊

爲了避免fac wx.Font和PIL.ImageFont之間的ename /文件名衝突我想我應該先用wxPython中的文本和所有屬性創建一個位圖,然後將其轉換爲PIL圖像。然後,而不是使用PIL.ImageFont繪製文本,將文本的位置稍微移過每幀,我應該將轉換後的wxBitmap粘貼到畫布上,使用PIL.Image的粘貼將每個幀的整個位圖略微移動一下?

我在這裏遇到的問題是找到正確的方式來使用任何wx的DC(ClientDC,PaintDC,(Auto)BufferedDC,MemoryDC)來創建位圖。到目前爲止,我可以使用wxMemoryDC wxBitmap將文本寫入位圖,但到目前爲止,我無法找到將位圖的完整VirtualSize設置爲包含整個圖像的方法,因爲它似乎僅限於窗口的ClientSize。我會從一開始就指定完整的大小,但是直到我收到消息的文本範圍時纔會有這些信息。從長遠來看,我寧願創建wxBitmap,甚至沒有在控件中顯示它,因爲它只是將目的傳遞給PIL進行進一步處理。

所以這裏是我求助的地方!有人可以請PLEASE闡明我如何可以找到一種方法來將wx.Font與PIL.ImageFont聯繫起來,這樣我就可以使用我的GIF動畫生成器來完成它已經設置的功能,或者幫助解決一些問題我如何使用wxPython創建一個位圖,並在我的文本中繪製所有文本,使其位於位圖中,而不管當前的ClientSize如何?我可以輕鬆將位圖轉換爲PIL,我只需要弄清楚如何使用wx創建它!

巨大的感謝,任何人都可以提供幫助,我對這個超級長期職位表示歉意,但是我應該在幾個星期前完成這個項目。這個荒謬的字體問題在我每次想到我已經想出來的時候都不停地拍打着我!因爲這是一個工作項目,如果你需要任何代碼樣本請求,我會抽出一些東西,沒有任何工作相關的信息。

回答

0

忘了不久前回答這個...

至於有關的字體,從長遠來看,我沒能找到一個可行的方法來完成這項任務。

使用Christopher提出的建議,我是能夠生成GIF動畫與清理運動問題頗有幾分指定的文本。

可惜我不能提供一個例子,因爲這項目是一個公司我工作了幾年回來,我沒有在這個時候訪問源代碼。

1

你有沒有研究過使用wx.MemoryDC帶雙緩衝窗口(即「位布林」)?基本技巧是,您將文字繪製到屏幕外的DC上,然後將它「blit」到屏幕上。這消除了閃爍。

這是wx wiki中的discussion about eliminating flicker

這是wxpython wiki中的discussion of double buffering

+0

感謝您的回覆瑞安,我已經使用了雙緩衝方法將正文試過,可惜無論我做什麼,我仍然可以使用閃爍過大的字體時。我一直在嘗試使用相同的概念來創建一種在wx中設計初始位圖的方法。如果我可以在wx中繪製文本,我可以完全避免wx/PIL facename/filename問題。然後,我可以將位圖轉換爲PIL圖像,然後通過將圖像粘貼到新的PIL圖像上並將文本圖像稍微移動到每幀左側來使用位圖創建我的單獨GIF幀。 – AWainb 2010-01-17 15:43:10

+0

我遇到的問題是如何寫出位圖,重新調整大小以適合所有文本,並且最好能夠完成所有這些操作,而無需將其顯示給用戶。通過我在網上找到的DC方法,我還沒有看到描述如何在這樣的幕後繪製圖像的方法,我也不能找到一種「真正的」方法來重新調整超過客戶大小的位圖以包含所有的文字。我發現的唯一建議是過度補償圖像尺寸,這種方式使我感到無用的內存浪費。 – AWainb 2010-01-17 15:50:09

+0

創建的wxPython的用戶谷歌組另一篇文章:http://groups.google.com/group/wxpython-users/browse_thread/thread/4196bb8d26954d21 – AWainb 2010-01-17 20:18:41

0

我打這個完全相同的問題。感謝您的註冊表項提示,這似乎工作得很好,但我正在構建一個應用程序,將安裝在一些Vista 64位機器上,由於某些原因,我無法在Vista下從Python讀取註冊表64.另外,它的如此kludgey不得不從字體標題中刪除所有額外的字符串,因爲它們出現在註冊表中,似乎要求麻煩。

如果可能,如果您找到解決方案,您可以告訴我嗎?我在Gmail上的wrybread,你知道什麼。如果你給我發郵件,我們可以討論。

編輯:這看起來很有希望,但我無法弄清楚如何訪問:

http://msdn.microsoft.com/en-us/library/dd144885(VS.85).aspx

顯然它不是由Python的WIN32API包裹。

+0

很抱歉的延遲反應,但我不得不把這個小項目擱置一點點。根據我對wxpython用戶所做的文章,似乎無法正確地將面名鏈接到文件名。 儘管..使用建議,我能夠在wxpython中繪製位圖,將其轉換爲pil並創建動畫gif。我會盡量在接下來的幾天內發佈一個例子。關於你的問題,它似乎與這個問題沒有直接關係,但如果你可以爲它創建一個單獨的問題,我會很樂意幫助我在哪裏。 – AWainb 2010-03-03 00:01:55

相關問題