<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # wxPython 圖形 > 原文: [http://zetcode.com/wxpython/gdi/](http://zetcode.com/wxpython/gdi/) GDI(圖形設備接口)是用于處理圖形的接口。 它用于與圖形設備(例如監視器,打印機或文件)進行交互。 GDI 允許程序員在屏幕或打印機上顯示數據,而不必擔心特定設備的詳細信息。 GDI 使程序員與硬件隔離。 從程序員的角度來看,GDI 是用于處理圖形的一組類和方法。 GDI 由 2D 向量圖形,字體和圖像組成。 ![The GDI](https://img.kancloud.cn/b0/9d/b09db60c9f39a2cb75a1bade1bbffe75_434x238.jpg) 圖:GDI 結構 要開始繪制圖形,我們必須創建一個設備上下文(DC)對象。 在 wxPython 中,設備上下文稱為`wx.DC`。 該文檔將`wx.DC`定義為可以在其上繪制圖形和文本的設備上下文。 它以通用方式表示設備數量。 同一段代碼可以寫入不同類型的設備。 無論是屏幕還是打印機。 `wx.DC`不能直接使用。 相反,程序員應選擇派生類之一。 每個派生類都打算在特定條件下使用。 ## 派生的`wx.DC`類 * `wxBufferedDC` * `wxBufferedPaintDC` * `wxPostScriptDC` * `wxMemoryDC` * `wxPrinterDC` * `wxScreenDC` * `wxClientDC` * `wxPaintDC` * `wxWindowDC` `wx.ScreenDC`用于在屏幕上的任何地方繪制。 如果要在整個窗口上繪制(僅 Windows),則使用`wx.WindowDC`。 這包括窗口裝飾。 `wx.ClientDC`用于繪制窗口的客戶區域。 客戶區域是沒有裝飾(標題和邊框)的窗口區域。 `wx.PaintDC`也用于繪制客戶區。 但是`wx.PaintDC`和`wx.ClientDC`之間有一個區別。 僅可從`wx.PaintEvent`使用`wx.PaintDC`。 不應從`wx.PaintEvent`中使用`wx.ClientDC`。 `wx.MemoryDC`用于在位圖上繪制圖形。 `wx.PostScriptDC`用于在任何平臺上寫入 PostScript 文件。 `wx.PrinterDC`用于訪問打印機(僅 Windows)。 ## 畫一條簡單的線 我們的第一個示例將在窗口的客戶區域上畫一條簡單的線。 ```py DrawLine(self, x1, y1, x2, y2) ``` 此方法從第一個點到第二個點畫一條線。 不包括第二點。 `draw_line.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws a line on the frame window after a while. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): wx.CallLater(2000, self.DrawLine) self.SetTitle("Line") self.Centre() def DrawLine(self): dc = wx.ClientDC(self) dc.DrawLine(50, 60, 190, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 兩秒鐘后,我們在框架窗口上畫了一條線。 ```py wx.FutureCall(2000, self.DrawLine) ``` 創建窗口后,我們將調用`DrawLine()`方法。 我們這樣做是因為在創建窗口時會繪制它。 因此,我們所有的圖紙都將丟失。 我們可以在創建窗口之后開始繪制。 這就是為什么我們調用`wx.FutureCall()`方法的原因。 ```py def DrawLine(self): dc = wx.ClientDC(self) dc.DrawLine(50, 60, 190, 60) ``` 我們創建一個`wx.ClientDC`設備上下文。 唯一的參數是我們要在其上繪制的窗口。 在我們的例子中是`self`,它是對`wx.Frame`小部件的引用。 我們稱為設備上下文的`DrawLine()`方法。 該調用實際上在我們的窗口上畫了一條線。 了解以下行為非常重要。 如果我們調整窗口大小,該行將消失。 為什么會這樣呢? 如果調整了每個窗口的大小,則會重新繪制每個窗口。 如果最大化,它也會被重畫。 如果我們用另一個窗口覆蓋該窗口,然后再將其打開,則該窗口也會重新繪制。 窗口被繪制為其默認狀態,我們的行丟失了。 每次調整窗口大小時,我們都必須畫一條線。 解決方法是`wx.PaintEvent`。 每次重新繪制窗口時都會觸發此事件。 我們將在掛鉤到 paint 事件的方法內繪制線條。 以下示例顯示了它是如何完成的。 `draw_line2.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws a line in a paint event. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Line") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.DrawLine(50, 60, 190, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 我們畫同一條線。 這次是對繪圖事件的反應。 ```py self.Bind(wx.EVT_PAINT, self.OnPaint) ``` 在這里,我們將`OnPaint`方法綁定到`wx.PaintEvent`事件。 這意味著每次重新繪制窗口時,我們都會調用`OnPaint()`方法。 現在,如果我們調整窗口大小(覆蓋,最大化窗口),該行將不會消失。 ```py dc = wx.PaintDC(self) ``` 注意,這一次我們使用了`wx.PaintDC`設備上下文。 ![Drawing a line](https://img.kancloud.cn/e2/ba/e2badd137e2a0851b800fe141de0cecb_400x250.jpg) 圖:畫一條線 ## 計算機圖形 有兩種不同的計算機圖形:向量和光柵圖形。 柵格圖形將圖像表示為像素的集合。 向量圖形是使用諸如點,線,曲線或多邊形之類的幾何圖元來表示圖像。 這些基元是使用數學方程式創建的。 兩種類型的計算機圖形都有優點和缺點。 向量圖形優于柵格的優點是: * 較小的大小 * 無限放大的能力 * 移動,縮放,填充或旋轉不會降低圖像質量 ### 基本類型 以下是圖形基元的部分列表。 * 點 * 線 * 折線 * 多邊形 * 圓圈 * 橢圓 * 樣條 ### 設備上下文屬性 設備上下文包含幾個屬性,例如筆刷,鋼筆或字體。 `wx.Brush`是用于填充區域的繪圖工具。 它用于繪制形狀的背景。 它具有顏色和樣式。 `wx.Pen`用于繪制形狀輪廓。 它具有顏色,寬度和樣式。 `wx.Font`是確定文本外觀的對象。 ## 基本要素 在下面的幾行中,我們介紹幾個基本對象:顏色,畫筆,筆,連接,蓋帽和漸變。 ### 顏色 顏色是代表紅色,綠色和藍色(RGB)強度值的組合的對象。 有效的 RGB 值在 0 到 255 之間。有三種設置顏色的方法。 我們可以創建`wx.Colour`對象,使用預定義的顏色名稱或十六進制值字符串。 `wx.Colour(0,0,255)`,`'BLUE'`和`'#0000FF'`。 這三個符號產生相同的顏色。 可以在 [colorjack.com](http://www.colorjack.com) 網站上找到處理顏色的理想工具。 或者我們可以使用 Gimp 這樣的工具。 我們還提供了可在程序中使用的預定義顏色名稱的列表。 | | | | | | | --- | --- | --- | --- | --- | | AQUAMARINE | BLACK | BLUE | BLUE VIOLET | BROWN | | CADET BLUE | CORAL | CORNFLOWER BLUE | CYAN | DARK GREY | | DARK GREEN | DARK OLIVE GREEN | DARK ORCHID | DARK SLATE BLUE | DARK SLATE GREY | | DARK TURQUOISE | DIM GREY | FIREBRICK | FOREST GREEN | GOLD | | GOLDENROD | GREY | GREEN | GREEN YELLOW | INDIAN RED | | KHAKI | LIGHT BLUE | LIGHT GREY | LIGHT STEEL BLUE | LIME GREEN | | MAGENTA | MAROON | MEDIUM AQUAMARINE | MEDIUM BLUE | MEDIUM FOREST GREEN | | MEDIUM GOLDENROD | MEDIUM ORCHID | MEDIUM SEA GREEN | MEDIUM SLATE BLUE | MEDIUM SPRING GREEN | | MEDIUM TURQUOISE | MEDIUM VIOLET RED | MIDNIGHT BLUE | NAVY | ORANGE | | ORANGE RED | ORCHID | PALE GREEN | PINK | PLUM | | PURPLE | RED | SALMON | SEA GREEN | SIENNA | | SKY BLUE | SLATE BLUE | SPRING GREEN | STEEL BLUE | TAN | | THISTLE | TURQUOISE | VIOLET | VIOLET RED | WHEAT | | WHITE | YELLOW | YELLOW GREEN | | | 下面的示例使用一些顏色值。 `colours.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws nine coloured rectangles on the window. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Colours") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('#d4d4d4')) dc.SetBrush(wx.Brush('#c56c00')) dc.DrawRectangle(10, 15, 90, 60) dc.SetBrush(wx.Brush('#1ac500')) dc.DrawRectangle(130, 15, 90, 60) dc.SetBrush(wx.Brush('#539e47')) dc.DrawRectangle(250, 15, 90, 60) dc.SetBrush(wx.Brush('#004fc5')) dc.DrawRectangle(10, 105, 90, 60) dc.SetBrush(wx.Brush('#c50024')) dc.DrawRectangle(130, 105, 90, 60) dc.SetBrush(wx.Brush('#9e4757')) dc.DrawRectangle(250, 105, 90, 60) dc.SetBrush(wx.Brush('#5f3b00')) dc.DrawRectangle(10, 195, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c')) dc.DrawRectangle(130, 195, 90, 60) dc.SetBrush(wx.Brush('#785f36')) dc.DrawRectangle(250, 195, 90, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 我們繪制九個矩形,并用不同的顏色填充它們。 ```py dc.SetBrush(wx.Brush('#c56c00')) dc.DrawRectangle(10, 15, 90, 60) ``` 我們以十六進制表示法指定畫筆的顏色。 筆刷是形狀的背景填充。 然后,使用`DrawRectangle()`方法繪制矩形。 ![Colours](https://img.kancloud.cn/12/18/121802a7fdeb463eeb970055d8706990_400x309.jpg) 圖:顏色 ### 筆 筆是基本的圖形對象。 它用于繪制矩形,橢圓形,多邊形或其他形狀的線,曲線和輪廓。 ```py wx.Pen(wx.Colour colour, width=1, style=wx.SOLID) ``` `wx.Pen`構造器具有三個參數:`colour`,`width`和`style`。 以下是可能的筆樣式的列表: * `wx.solid` * `wx.DOT` * `wx.LONG_DASH` * `wx.SHORT_DASH` * `wx.DOT_DASH` * `wx.TRANSPARENT` `pens.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws six rectangles with different pens. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Pens") self.Centre() def OnPaint(self, event): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.SOLID)) dc.DrawRectangle(10, 15, 90, 60) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.DOT)) dc.DrawRectangle(130, 15, 90, 60) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.LONG_DASH)) dc.DrawRectangle(250, 15, 90, 60) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.SHORT_DASH)) dc.DrawRectangle(10, 105, 90, 60) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.DOT_DASH)) dc.DrawRectangle(130, 105, 90, 60) dc.SetPen(wx.Pen('#4c4c4c', 1, wx.TRANSPARENT)) dc.DrawRectangle(250, 105, 90, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 如果未指定自定義畫筆,則使用默認畫筆。 默認畫筆為`wx.WHITE_BRUSH`。 矩形的周長由筆繪制。 最后一個沒有邊界。 它是透明的,即不可見。 ![Pens](https://img.kancloud.cn/14/6b/146bca1866e451a103be461fa05b43f3_400x250.jpg) 圖:筆 ### 連接和蓋帽 筆對象具有其他兩個參數:連接和蓋帽。 連接定義線之間的連接如何繪制。 連接樣式具有以下選項: * `wx.JOIN_MITER` * `wx.JOIN_BEVEL` * `wx.JOIN_ROUND` 使用`wx.JOIN_MITER`時,線條的外邊緣會延伸。 他們以一個角度相遇,并且該區域被填充。 在`wx.JOIN_BEVEL`中,兩條線之間的三角形缺口被填充。 在`wx.JOIN_ROUND`中,填充了兩條線之間的圓弧。 默認值為`wx.JOIN_ROUND`。 筆帽定義了筆將如何繪制線條的末端。 選項包括: * `wx.CAP_ROUND` * `wx.CAP_PROJECTING` * `wx.CAP_BUTT` `wx.CAP_ROUND`繪制圓形末端。 `wx.CAP_PROJECTING`和`wx.CAP_BUTT`畫出方形末端。 它們之間的區別是`wx.CAP_PROJECTING`將超出端點超出行大小的一半。 `wx.CAP_ROUND`也將延伸到終點之外。 `joins_caps.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws uses different joins and caps in drawing. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Joins and caps") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) pen = wx.Pen('#4c4c4c', 10, wx.SOLID) pen.SetJoin(wx.JOIN_MITER) dc.SetPen(pen) dc.DrawRectangle(15, 15, 80, 50) pen.SetJoin(wx.JOIN_BEVEL) dc.SetPen(pen) dc.DrawRectangle(125, 15, 80, 50) pen.SetJoin(wx.JOIN_ROUND) dc.SetPen(pen) dc.DrawRectangle(235, 15, 80, 50) pen.SetCap(wx.CAP_BUTT) dc.SetPen(pen) dc.DrawLine(30, 150, 150, 150) pen.SetCap(wx.CAP_PROJECTING) dc.SetPen(pen) dc.DrawLine(30, 190, 150, 190) pen.SetCap(wx.CAP_ROUND) dc.SetPen(pen) dc.DrawLine(30, 230, 150, 230) pen2 = wx.Pen('#4c4c4c', 1, wx.SOLID) dc.SetPen(pen2) dc.DrawLine(30, 130, 30, 250) dc.DrawLine(150, 130, 150, 250) dc.DrawLine(155, 130, 155, 250) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` ```py pen = wx.Pen('#4c4c4c', 10, wx.SOLID) ``` 為了查看各種連接樣式和蓋帽樣式,我們需要將筆的寬度設置為大于 1。 ```py dc.DrawLine(150, 130, 150, 250) dc.DrawLine(155, 130, 155, 250) ``` 注意兩條封閉的垂直線。 它們之間的距離是 5px。 恰好是當前筆寬的一半。 ![Joins and Caps](https://img.kancloud.cn/1e/13/1e13c145637ffac63b9e361d67b4947a_453x304.jpg) 圖:連接和蓋帽 ### 漸變 在計算機圖形學中,漸變是從淺到深或從一種顏色到另一種顏色的陰影的平滑混合。 在 2D 繪圖程序和繪圖程序中,漸變用于創建彩色背景和特殊效果以及模擬燈光和陰影。 ```py GradientFillLinear(self, rect, initialColour, destColour, nDirection=RIGHT) ``` 此方法使用線性漸變填充`rect`指定的區域,該區域從`initialColour`開始并最終逐漸變為`destColour`。 `nDirection`參數指定顏色改變的方向; 默認值為`wx.EAST`。 `gradients.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws four rectangles filled with gradients. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Gradients") self.Centre() def OnPaint(self, event): dc = wx.PaintDC(self) dc.GradientFillLinear((20, 20, 180, 40), '#ffec00', '#000000', wx.NORTH) dc.GradientFillLinear((20, 80, 180, 40), '#ffec00', '#000000', wx.SOUTH) dc.GradientFillLinear((20, 140, 180, 40), '#ffec00', '#000000', wx.EAST) dc.GradientFillLinear((20, 200, 180, 40), '#ffec00', '#000000', wx.WEST) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在該示例中,四個矩形填充有漸變。 ![Gradients](https://img.kancloud.cn/04/be/04bea5f7a5f7ca82ec1dadd127691fdf_250x292.jpg) 圖:漸變 ### `wx.brush` 畫筆是基本的圖形對象。 它用于繪制圖形形狀的背景,例如矩形,橢圓形或多邊形。 wxPython 具有以下內置畫筆類型: * `wx.SOLID` * `wx.STIPPLE` * `wx.BDIAGONAL_HATCH` * `wx.CROSSDIAG_HATCH` * `wx.FDIAGONAL_HATCH` * `wx.CROSS_HATCH` * `wx.HORIZONTAL_HATCH` * `wx.VERTICAL_HATCH` * `wx.TRANSPARENT` `brushes.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws eight rectangles filled with different brushes. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Brushes") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetBrush(wx.Brush('#4c4c4c', wx.CROSS_HATCH)) dc.DrawRectangle(10, 15, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.SOLID)) dc.DrawRectangle(130, 15, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.BDIAGONAL_HATCH)) dc.DrawRectangle(250, 15, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.CROSSDIAG_HATCH)) dc.DrawRectangle(10, 105, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.FDIAGONAL_HATCH)) dc.DrawRectangle(130, 105, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.HORIZONTAL_HATCH)) dc.DrawRectangle(250, 105, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.VERTICAL_HATCH)) dc.DrawRectangle(10, 195, 90, 60) dc.SetBrush(wx.Brush('#4c4c4c', wx.TRANSPARENT)) dc.DrawRectangle(130, 195, 90, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在示例中使用了八種不同的內置畫筆類型。 ![Brushes](https://img.kancloud.cn/b7/5a/b75a005434de5d3064f6046f9e72ac0e_400x315.jpg) 圖:筆刷 ### 自定義模式 我們不限于使用預定義的模式。 我們可以輕松創建自己的自定義模式。 `custom_patterns.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws three rectangles with custom brush patterns. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Custom patterns") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('#C7C3C3')) brush1 = wx.Brush(wx.Bitmap('pattern1.png')) dc.SetBrush(brush1) dc.DrawRectangle(10, 15, 90, 60) brush2 = wx.Brush(wx.Bitmap('pattern2.png')) dc.SetBrush(brush2) dc.DrawRectangle(130, 15, 90, 60) brush3 = wx.Brush(wx.Bitmap('pattern3.png')) dc.SetBrush(brush3) dc.DrawRectangle(250, 15, 90, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 我們創建了一些小的位圖。 位圖是在 Gimp 中創建的。 ```py brush1 = wx.Brush(wx.Bitmap('pattern1.png')) dc.SetBrush(brush1) dc.DrawRectangle(10, 15, 90, 60) ``` 從位圖創建畫筆,并將其設置為設備上下文。 它用于填充矩形的內部。 ![Custom Patterns](https://img.kancloud.cn/14/ee/14ee98f26febc3b6260199b426042b8e_400x125.jpg) 圖:自定義模式 ### 點 最簡單的幾何對象是一個點。 它是窗口上的一個普通點。 ```py DrawPoint(self, x, y) ``` 此方法在 x,y 坐標處繪制點。 `points.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws one thousand points randomly on the window. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx import random class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Points") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('RED')) for i in range(1000): w, h = self.GetSize() x = random.randint(1, w-1) y = random.randint(1, h-1) dc.DrawPoint(x, y) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 一個點可能很難看清,因此我們創建了 1000 個點。 ```py dc.SetPen(wx.Pen('RED')) ``` 在這里,我們將筆的顏色設置為紅色。 ```py w, h = self.GetSize() x = random.randint(1, w-1) ``` 這些點在窗口的客戶區域周圍隨機分布。 它們也可以動態分配。 如果我們調整窗口的大小,將在新的客戶端大小上隨機繪制點。 `randint(a, b)`方法返回范圍為`[a,b]`的隨機整數,例如包括兩點。 ![Points](https://img.kancloud.cn/0d/fc/0dfcaaa23559db38b61ff9c159b7aa49_324x182.jpg) 圖:繪制點 ## 形狀 形狀是更復雜的幾何對象。 在以下示例中,我們繪制了各種幾何形狀。 `shapes.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws various shapes on the window. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Shapes") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetBrush(wx.Brush('#777')) dc.SetPen(wx.Pen("#777")) dc.DrawEllipse(20, 20, 90, 60) dc.DrawRoundedRectangle(130, 20, 90, 60, 10) dc.DrawArc(240, 40, 340, 40, 290, 20) dc.DrawRectangle(20, 120, 80, 50) dc.DrawPolygon(((130, 140), (180, 170), (180, 140), (220, 110), (140, 100))) dc.DrawSpline(((240, 170), (280, 170), (285, 110), (325, 110))) dc.DrawLines(((20, 260), (100, 260), (20, 210), (100, 210))) dc.DrawCircle(170, 230, 35) dc.DrawRectangle(250, 200, 60, 60) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,我們繪制了一個橢圓,一個圓角矩形,一個圓弧,一個矩形,一個多邊形,樣條曲線,線,一個圓和一個正方形。 圓形是一種特殊的橢圓,而正方形是一種特殊的矩形。 ![Shapes](https://img.kancloud.cn/9d/03/9d03bf19345482fb930f2da62a81e886_400x312.jpg) 圖:形狀 ## 區域 設備上下文可以分為幾個部分,稱為區域。 區域可以是任何形狀,例如矩形或圓形。 使用`Union`,`Intersect`,`Substract`和`Xor`操作,我們可以創建復雜區域。 區域用于概述,填充和裁剪。 我們可以通過三種方式創建區域。 最簡單的方法是創建一個矩形區域。 可以從位圖的點列表創建更復雜的區域。 在前往區域之前,我們將首先創建一個小示例。 我們將該主題分為幾個部分,以便于理解。 您可能會發現修改學校數學是一個好主意。 [在這里](http://en.wikipedia.org/wiki/Circle)我們可以找到一篇不錯的文章。 `lines.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program draws various shapes on the window. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx from math import hypot, sin, cos, pi class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle('Lines') self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) size_x, size_y = self.GetClientSize() dc.SetDeviceOrigin(size_x/2, size_y/2) radius = hypot(size_x/2, size_y/2) angle = 0 while (angle < 2*pi): x = radius*cos(angle) y = radius*sin(angle) dc.DrawLine((0, 0), (x, y)) angle = angle + 2*pi/360 def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在此示例中,我們從客戶區域的中間繪制了 360 條線。 兩條線之間的距離是 1 度。 我們創造了一個有趣的人物。 ```py import wx from math import hypot, sin, cos, pi ``` 我們需要數學模塊中的三個數學函數和一個常數。 ```py dc.SetDeviceOrigin(size_x/2, size_y/2) ``` 方法`SetDeviceOrigin()`創建坐標系的新起點。 我們將其放入客戶區的中間。 通過重新定位坐標系,我們使圖形的復雜程度降低了。 ```py radius = hypot(size_x/2, size_y/2) ``` 在這里,我們得到了斜邊。 這是最長的線,我們可以從客戶區域的中間繪制。 它是從開始到窗口角落的線段長度。 這樣,大多數線條都無法完全畫出。 重疊部分不可見。 參見[斜邊](http://en.wikipedia.org/wiki/Hypotenuse)。 ```py x = radius*cos(angle) y = radius*sin(angle) ``` 這些是參數函數。 它們用于在曲線上找到`[x,y]`點。 從坐標系的開始一直到圓上的點繪制所有 360 條線。 ![Lines](https://img.kancloud.cn/6a/8c/6a8ce879b340b8c197574919fbe7eac7_400x250.jpg) 圖:直線 ## 剪裁 `Clipping`將繪圖限制在特定區域。 裁剪通常用于創建效果并改善應用的性能。 我們使用`SetClippingRegionAsRegion()`方法將繪圖限制在特定區域。 在下面的示例中,我們將修改和增強我們以前的程序。 `star.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program demonstrates a clipping operation when drawing a star object. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx from math import hypot, sin, cos, pi class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Star") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('#424242')) size_x, size_y = self.GetClientSize() dc.SetDeviceOrigin(size_x/2, size_y/2) points = (((0, 85), (75, 75), (100, 10), (125, 75), (200, 85), (150, 125), (160, 190), (100, 150), (40, 190), (50, 125))) region = wx.Region(points) dc.SetDeviceClippingRegion(region) radius = hypot(size_x/2, size_y/2) angle = 0 while (angle < 2*pi): x = radius*cos(angle) y = radius*sin(angle) dc.DrawLine((0, 0), (x, y)) angle = angle + 2*pi/360 dc.DestroyClippingRegion() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 我們再次繪制所有 360 線。 但是這次,只繪制了一部分客戶區域。 我們將繪圖限制到的區域是星形對象。 ```py region = wx.Region(points) dc.SetDeviceClippingRegion(region) ``` 我們從點列表創建一個區域。 `SetDeviceClippingRegion()`方法將圖形限制在指定的區域。 在我們的情況下,它是一個恒星對象。 ```py dc.DestroyClippingRegion() ``` 我們必須銷毀剪切區域。 ![Star](https://img.kancloud.cn/36/d7/36d7e0802354c6f7e5ee75982a7a4b16_400x250.jpg) 圖:星星 ## 區域操作 可以組合區域以創建更復雜的形狀。 我們可以使用四個集合運算:并集,相交,減法,異或。 以下示例顯示了所有正在執行的四個操作。 `region_operations.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program performs set operations on regions. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle("Regions") self.Centre() def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen('#d4d4d4')) dc.DrawRectangle(20, 20, 50, 50) dc.DrawRectangle(30, 40, 50, 50) dc.SetBrush(wx.Brush('#ffffff')) dc.DrawRectangle(100, 20, 50, 50) dc.DrawRectangle(110, 40, 50, 50) region1 = wx.Region(100, 20, 50, 50) region2 = wx.Region(110, 40, 50, 50) region1.Intersect(region2) rect = region1.GetBox() dc.SetDeviceClippingRegion(region1) dc.SetBrush(wx.Brush('#ff0000')) dc.DrawRectangle(rect) dc.DestroyClippingRegion() dc.SetBrush(wx.Brush('#ffffff')) dc.DrawRectangle(180, 20, 50, 50) dc.DrawRectangle(190, 40, 50, 50) region1 = wx.Region(180, 20, 50, 50) region2 = wx.Region(190, 40, 50, 50) region1.Union(region2) dc.SetDeviceClippingRegion(region1) rect = region1.GetBox() dc.SetBrush(wx.Brush('#fa8e00')) dc.DrawRectangle(rect) dc.DestroyClippingRegion() dc.SetBrush(wx.Brush('#ffffff')) dc.DrawRectangle(20, 120, 50, 50) dc.DrawRectangle(30, 140, 50, 50) region1 = wx.Region(20, 120, 50, 50) region2 = wx.Region(30, 140, 50, 50) region1.Xor(region2) rect = region1.GetBox() dc.SetDeviceClippingRegion(region1) dc.SetBrush(wx.Brush('#619e1b')) dc.DrawRectangle(rect) dc.DestroyClippingRegion() dc.SetBrush(wx.Brush('#ffffff')) dc.DrawRectangle(100, 120, 50, 50) dc.DrawRectangle(110, 140, 50, 50) region1 = wx.Region(100, 120, 50, 50) region2 = wx.Region(110, 140, 50, 50) region1.Subtract(region2) rect = region1.GetBox() dc.SetDeviceClippingRegion(region1) dc.SetBrush(wx.Brush('#715b33')) dc.DrawRectangle(rect) dc.DestroyClippingRegion() dc.SetBrush(wx.Brush('#ffffff')) dc.DrawRectangle(180, 120, 50, 50) dc.DrawRectangle(190, 140, 50, 50) region1 = wx.Region(180, 120, 50, 50) region2 = wx.Region(190, 140, 50, 50) region2.Subtract(region1) rect = region2.GetBox() dc.SetDeviceClippingRegion(region2) dc.SetBrush(wx.Brush('#0d0060')) dc.DrawRectangle(rect) dc.DestroyClippingRegion() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在示例中,我們提出了六個區域設置操作。 ```py region1 = wx.Region(100, 20, 50, 50) region2 = wx.Region(110, 40, 50, 50) region1.Intersect(region2) ``` 此代碼在兩個區域上執行交叉操作。 ![Set operations on regions](https://img.kancloud.cn/e8/19/e8198a9a34ebff9178028af358c1936e_400x250.jpg) 圖:區域上的設置操作 ## 映射模式 映射模式定義用于將頁面空間單位轉換為設備空間單位的度量單位,并且還定義設備的 x 和 y 軸的方向。 ### 用英語說,用公制衡量 英語成為全球交流的語言。 度量系統也因此成為度量系統中的全局系統。 根據[維基百科文章](http://en.wikipedia.org/wiki/Metric_system)的介紹,只有三個例外。 美國,利比里亞和緬甸。 例如,美國人用華氏溫度來測量溫度,用加侖來加油或用磅來稱重。 即使我們在歐洲使用公制,也有例外。 美國主導著 IT,我們正在導入其標準。 所以我們也說我們有一臺 17 英寸的顯示器。 圖形可以放入文件中,可以在監視器或其他設備(相機,攝像機,移動電話)的屏幕上顯示,也可以用打印機進行打印。 紙張大小可以以毫米,點或英寸為單位設置,屏幕的分辨率以像素為單位,文本的質量取決于每英寸的點數。 我們也有點,位或樣本。 這是我們擁有邏輯和設備單元的原因之一。 ## 邏輯和設備單元 如果在客戶區上繪制文本或幾何圖元,則使用邏輯單元對其進行定位。 如果要繪制一些文本,請提供`text`參數和 x,y 位置。 x,y 以邏輯單位表示。 然后,設備以設備為單位繪制文本。 邏輯和設備單元可以相同,也可以不同。 邏輯單位由人(毫米)使用,設備單位是`particular`設備固有的。 例如,屏幕的本機設備單位是像素。 `HEWLETT PACKARD LaserJet 1022`的本機設備單位為 1200dpi(每英寸點數)。 到目前為止,我們已經討論了各種度量單位。 設備的映射模式是一種將邏輯單元轉換為設備單元的方法。 wxPython 具有以下映射模式: | 映射模式 | 邏輯單元 | | --- | --- | | `wx.MM_TEXT` | 1 像素 | | `wx.MM_METRIC` | 1 毫米 | | `wx.MM_LOMETRIC` | 1/10 毫米 | | `wx.MM_POINTS` | 1 點,1/72 英寸 | | `wx.MM_TWIPS` | 點的 1/20 或 1/1440 英寸 | 默認的映射模式是`wx.MM_TEXT`。 在此模式下,邏輯單元與設備單元相同。 人們將對象放置在屏幕上或設計網頁時,他們通常以像素為單位思考。 Web 設計人員創建三列頁面,這些列以像素為單位設置。 頁面的最低公分母通常是 800px 等。這種想法很自然,因為我們知道我們的顯示器具有`1024x768`像素,我們不打算進行轉換,而是習慣于以像素為單位進行思考。 如果要以毫米為單位繪制結構,則可以使用兩種度量映射模式。 對于屏幕而言,以毫米為單位直接繪制太厚了,這就是為什么我們要使用`wx.MM_LOMETRIC`映射模式。 要設置不同的映射模式,我們使用`SetMapMode()`方法。 ## 標尺示例 標尺以像素為單位測量屏幕對象。 `ruler.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This program creates a ruler. author: Jan Bodnar website: zetcode.com last edited: May 2018 """ import wx RW = 701 # ruler width RM = 10 # ruler margin RH = 80 # ruler height class Example(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, size=(RW + 2*RM, RH), style=wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.STAY_ON_TOP) self.font = wx.Font(7, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, 'Courier 10 Pitch') self.InitUI() def InitUI(self): self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Centre() self.Show(True) def OnPaint(self, e): dc = wx.PaintDC(self) brush = wx.Brush(wx.Bitmap('granite.png')) dc.SetBrush(brush) dc.DrawRectangle(0, 0, RW+2*RM, RH) dc.SetFont(self.font) dc.SetPen(wx.Pen('#F8FF25')) dc.SetTextForeground('#F8FF25') for i in range(RW): if not (i % 100): dc.DrawLine(i+RM, 0, i+RM, 10) w, h = dc.GetTextExtent(str(i)) dc.DrawText(str(i), i+RM-w/2, 11) elif not (i % 20): dc.DrawLine(i+RM, 0, i+RM, 8) elif not (i % 2): dc.DrawLine(i+RM, 0, i+RM, 4) def OnLeftDown(self, e): x, y = self.ClientToScreen(e.GetPosition()) ox, oy = self.GetPosition() dx = x - ox dy = y - oy self.delta = ((dx, dy)) def OnMouseMove(self, e): if e.Dragging() and e.LeftIsDown(): self.SetCursor(wx.Cursor(wx.CURSOR_HAND)) x, y = self.ClientToScreen(e.GetPosition()) fp = (x - self.delta[0], y - self.delta[1]) self.Move(fp) def OnLeftUp(self, e): self.SetCursor(wx.Cursor(wx.CURSOR_ARROW)) def OnRightDown(self, e): self.Close() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在此示例中,我們創建一個標尺。 此標尺以像素為單位測量屏幕對象。 我們保留了默認的映射模式,即`wx.MM_TEXT`。 正如我們已經提到的,此模式具有相同的邏輯和設備單元。 在我們的例子中,這些是像素。 ```py def __init__(self, parent): wx.Frame.__init__(self, parent, size=(RW + 2*RM, RH), style=wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.STAY_ON_TOP) ``` 我們創建了一個無邊界的窗口。 標尺寬 721 像素:`RW + 2 * RM = 701 + 20 = 721`。標尺顯示 700 個數字;`0 ... 700`為 701 像素。 標尺兩邊都有空白,`2 * 10`是 20 像素。 兩者合計為 721 像素。 ```py brush = wx.Brush(wx.Bitmap('granite.png')) dc.SetBrush(brush) dc.DrawRectangle(0, 0, RW+2*RM, RH) ``` 在這里,我們在窗口上繪制一個自定義模式。 我們使用了 Gimp 中可用的預定義模式。 它被稱為花崗巖。 ```py w, h = dc.GetTextExtent(str(i)) dc.DrawText(str(i), i+RM-w/2, 11) ``` 這些行確保我們正確對齊文本。 `GetTextExtent()`方法返回文本的寬度和高度。 窗口周圍沒有邊框。 因此,我們必須手動處理移動。 `OnLeftDown()`和`OnMouseMove()`方法使我們能夠移動標尺。 ```py def OnLeftDown(self, e): x, y = self.ClientToScreen(e.GetPosition()) ox, oy = self.GetPosition() dx = x - ox dy = y - oy self.delta = ((dx, dy)) ``` 在`OnLeftDown()`方法中,我們確定窗口和鼠標光標的坐標;`delta`值是鼠標指針距窗口左上角的距離。 我們需要`delta`值才能移動窗口。 ```py def OnMouseMove(self, e): if e.Dragging() and e.LeftIsDown(): self.SetCursor(wx.Cursor(wx.CURSOR_HAND)) x, y = self.ClientToScreen(e.GetPosition()) fp = (x - self.delta[0], y - self.delta[1]) self.Move(fp) ``` 當我們同時拖動窗口并按下鼠標左鍵時,將執行該代碼。 在代碼塊中,我們使用`SetCursor()`更改鼠標光標,并使用`Move()`方法移動窗口。 增量值用于獲取距離。 ```py def OnLeftUp(self, e): self.SetCursor(wx.Cursor(wx.CURSOR_ARROW)) ``` 釋放鼠標左鍵時,將光標改回到箭頭。 ```py def OnRightDown(self, e): self.Close() ``` 右鍵單擊窗口區域可關閉窗口。 ![Ruler example](https://img.kancloud.cn/a9/eb/a9eb5556012cb30e8eb2901ff9e27955_719x55.jpg) 圖:標尺示例 在本章中,我們使用了 wxPython 中的圖形。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看