2013-08-02 48 views
1

假設我有一個Paper (wx.Panel),我想以毫米爲單位繪製一個圖表,因此我將PaintDc的映射模式設置爲毫米:dc.SetMapMode(wx.MM_METRIC),然後我將繪製橫軸。wxPython,如何以毫米爲單位獲取小部件的大小?

class Paper(wx.Panel): 
    def onPaint(self, event): 
     dc = wx.PaintDC(self) 
     dc.SetMapMode(wx.MM_METRIC) 
     w, h = self.GetClientSize() <<< This line get size in pixel. 
     dc.DrawLine(0, h-10, w-1, h-10) 

我希望軸從紙張的底部遠方停留10毫米,所以我查詢爲w, h = self.GetClientSize()紙張的尺寸,但問題是尺寸爲像素,而不是毫米。

以mm爲單位獲得面板尺寸的功能是什麼,或者是否有將像素尺寸映射到mm的功能?

回答

2

我不是一個Python程序員,也沒有使用wxWidgets超過很短的時間,所以我的答案是純粹假設沒有方法會爲你做這件事。

您需要獲得屏幕的分辨率(通常爲75dpi),然後計算該屏幕上像素相等的毫米數。屏幕分辨率http://www.scantips.com/basics1a.html

詳細不要以爲無需校準或得到一些源監控信息,你會得到一個規則,測量同一毫米爲你的平局。

2

幸運的是,我發現有函數來獲取在像素和毫米:wx.GetDisplaySize()wx.GetDisplaySizeMM(),我可以用它來計算每個像素mmperpx毫米的量,這反過來又可以用來轉換屏幕的尺寸尺寸以像素爲單位,以毫米爲單位。

def px2mm(pixels): 
    px = float(wx.GetDisplaySize()[1]) 
    mm = float(wx.GetDisplaySizeMM()[1]) 
    mmperpx = mm/px 
    return mmperpx * pixels 
+1

那麼,您能否將我的回答標記爲答案,我認爲您正在做我所說的。除了事實上它可以根據顯示器做出錯誤的結果,所以如果你需要精確的結果,那不是最好的方法。 引用來自http://markmail.org/message/2prubyh6h5cnwfg5 與所說的相反,我相信監視器和圖形卡之間的一些協議可以通知監視器的DPI,或監視器的型號和製造商可以根據製造商的規格來確定DPI。謝謝。 –

+1

對於您不想依賴可能出錯的信息的應用程序,您可以簡單地向用戶展示圖形,並要求它測量它的實際大小,以便您確切知道DPI,精度無論如何取決於用戶measurament。 –

相關問題