{"id":924,"date":"2023-06-02T00:09:54","date_gmt":"2023-06-01T16:09:54","guid":{"rendered":"http:\/\/xinyixx.com\/?p=924"},"modified":"2023-06-12T00:21:35","modified_gmt":"2023-06-11T16:21:35","slug":"python6","status":"publish","type":"post","link":"https:\/\/www.xinyixx.com\/index.php\/2023\/06\/02\/python6\/","title":{"rendered":"python6\u7a0b\u5e8f\uff1a\u5199\u4e00\u4e2a\u753b\u56fe\u8f6f\u4ef6"},"content":{"rendered":"\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>wxPython\u662f\u4e00\u4e2a\u57fa\u4e8ePython\u7684GUI\u5f00\u53d1\u6846\u67b6\uff0c\u5b83\u4f7f\u7528\u4e86wxWidgets C++\u5e93\u4f5c\u4e3a\u5176\u5e95\u5c42GUI\u5f15\u64ce\uff0c\u63d0\u4f9b\u4e86\u4e00\u5957\u8de8\u5e73\u53f0\u7684GUI\u5de5\u5177\u5305\u3002wxPython\u6a21\u5757\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u5feb\u901f\u5730\u6784\u5efa\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\uff0c\u652f\u6301Windows\u3001Linux\u548cMacOS\u7b49\u591a\u4e2a\u5e73\u53f0\u3002<\/p>\n\n\n\n<p>wxPython\u6a21\u5757\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684GUI\u7ec4\u4ef6\uff0c\u4f8b\u5982\u6309\u94ae\u3001\u6587\u672c\u6846\u3001\u6807\u7b7e\u3001\u83dc\u5355\u3001\u5bf9\u8bdd\u6846\u7b49\uff0c\u540c\u65f6\u4e5f\u652f\u6301\u81ea\u5b9a\u4e49\u7ec4\u4ef6\u7684\u5f00\u53d1\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u4f7f\u7528wxPython\u6a21\u5757\u521b\u5efa\u5404\u79cd\u7c7b\u578b\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f8b\u5982\u6587\u672c\u7f16\u8f91\u5668\u3001\u56fe\u5f62\u754c\u9762\u5de5\u5177\u3001\u97f3\u9891\u64ad\u653e\u5668\u7b49\u3002<\/p>\n\n\n\n<p>\u7528wx \u6a21\u5757\u5199\u4e00\u4e2a\u753b\u56fe\u8f6f\u4ef6\uff0c\u4ee3\u7801\u5982\u4e0b\uff0c\u4e2d\u6587\u91ca\u4e49\u4ee5\u5199\u51fa\uff08\u4ee3\u7801\u751f\u6210\u6709\u95ee\u9898\uff0c\u505a\u4e2a\u53c2\u8003\uff0c\u6539\u4e0d\u52a8\u4e86\u3002\u3002\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>   <\/code>import wx\nclass PaintWindow(wx.Window):\ndef init(self, parent):\nsuper().init(parent)\nself.SetBackgroundColour(\"WHITE\") # \u8bbe\u7f6e\u7a97\u53e3\u80cc\u666f\u989c\u8272\u4e3a\u767d\u8272\nself.color = \"BLACK\" # \u9ed8\u8ba4\u989c\u8272\u4e3a\u9ed1\u8272\nself.thickness = 1 # \u9ed8\u8ba4\u7ebf\u6761\u7c97\u7ec6\u4e3a1\nself.pen = wx.Pen(self.color, self.thickness, wx.SOLID) # \u521b\u5efa\u753b\u7b14\u5bf9\u8c61\nself.lines = &#91;] # \u5b58\u50a8\u7ed8\u5236\u7684\u6240\u6709\u7ebf\u6761\nself.curLine = &#91;] # \u5b58\u50a8\u5f53\u524d\u6b63\u5728\u7ed8\u5236\u7684\u7ebf\u6761\nself.pos = (0, 0) # \u5f53\u524d\u9f20\u6807\u4f4d\u7f6e\nself.InitBuffer()<code>self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)  # \u7ed1\u5b9a\u9f20\u6807\u5de6\u952e\u6309\u4e0b\u4e8b\u4ef6\n    self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)  # \u7ed1\u5b9a\u9f20\u6807\u5de6\u952e\u91ca\u653e\u4e8b\u4ef6\n    self.Bind(wx.EVT_MOTION, self.OnMotion)  # \u7ed1\u5b9a\u9f20\u6807\u79fb\u52a8\u4e8b\u4ef6\n    self.Bind(wx.EVT_SIZE, self.OnSize)  # \u7ed1\u5b9a\u7a97\u53e3\u5927\u5c0f\u6539\u53d8\u4e8b\u4ef6\n    self.Bind(wx.EVT_IDLE, self.OnIdle)  # \u7ed1\u5b9a\u7a97\u53e3\u7a7a\u95f2\u4e8b\u4ef6\n    self.Bind(wx.EVT_PAINT, self.OnPaint)  # \u7ed1\u5b9a\u7a97\u53e3\u91cd\u7ed8\u4e8b\u4ef6\n\ndef InitBuffer(self):\n    size = self.GetClientSize()  # \u83b7\u53d6\u7a97\u53e3\u5c3a\u5bf8\n    self.buffer = wx.Bitmap(size.width, size.height)  # \u521b\u5efa\u7f13\u5b58\u4f4d\u56fe\n    dc = wx.BufferedDC(None, self.buffer)  # \u521b\u5efa\u7f13\u5b58\u8bbe\u5907\u4e0a\u4e0b\u6587\n    dc.SetBackground(wx.Brush(self.GetBackgroundColour()))  # \u8bbe\u7f6e\u80cc\u666f\u5237\n    dc.Clear()  # \u6e05\u7a7a\u7f13\u5b58\u8bbe\u5907\u4e0a\u4e0b\u6587\n    self.DrawLines(dc)  # \u7ed8\u5236\u5df2\u4fdd\u5b58\u7684\u7ebf\u6761\n    self.reInitBuffer = False\n\ndef GetLinesData(self):\n    return self.lines&#91;:]\n\ndef SetLinesData(self, lines):\n    self.lines = lines&#91;:]\n    self.InitBuffer()\n    self.Refresh()\n\ndef OnLeftDown(self, event):\n    self.curLine = &#91;]\n    self.pos = event.GetPosition()\n    self.CaptureMouse()\n\ndef OnLeftUp(self, event):\n    if self.HasCapture():\n        self.lines.append((self.color, self.thickness, self.curLine))\n        self.curLine = &#91;]\n        self.ReleaseMouse()\n\ndef OnMotion(self, event):\n    if event.Dragging() and event.LeftIsDown():\n        dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)\n        self.drawMotion(dc, event)\n    event.Skip()\n\ndef drawMotion(self, dc, event):\n    dc.SetPen(self.pen)\n    newPos = event.GetPosition()\n    coords = (self.pos, newPos)\n    self.curLine.append(coords)\n    dc.DrawLine(*coords)\n    self.pos = newPos\n\ndef OnSize(self, event):\n    self.reInitBuffer = True\n\ndef OnIdle(self, event):\n    if self.reInitBuffer:\n        self.InitBuffer()\n        self.Refresh()\n\ndef OnPaint(self, event):\n    dc = wx.BufferedPaintDC(self, self.buffer)\n\ndef DrawLines(self, dc):\n    for color, thickness, line in self.lines:\n        pen = wx.Pen(color, thickness, wx.SOLID)\n        dc.SetPen(pen)\n        for coords in line:\n            dc.DrawLine(*coords)<\/code>class PaintFrame(wx.Frame):\r\ndef init(self):\r\nsuper().init(None, title=\"Simple Paint\")\r\nself.paintWindow = PaintWindow(self)# \u521b\u5efa\u83dc\u5355\u680f\r\n    menubar = wx.MenuBar()\r\n\r\n    # \u521b\u5efa\u6587\u4ef6\u83dc\u5355\r\n    fileMenu = wx.Menu()\r\n    saveItem = fileMenu.Append(-1, \"&amp;Save\\tCtrl+S\", \"Save the current drawing\")\r\n    menubar.Append(fileMenu, \"&amp;File\")\r\n\r\n    # \u521b\u5efa\u989c\u8272\u83dc\u5355\r\n    colorMenu = wx.Menu()\r\n    colors = &#91;\"BLACK\", \"RED\", \"GREEN\", \"BLUE\"]\r\n    colorRadioGroup = wx.Menu()\r\n\r\n    for index, color in enumerate(colors):\r\n        colorRadioGroup.AppendRadioItem(-1, color)\r\n    colorMenu.Append(-1, \"&amp;Color\", colorRadioGroup)  # \u5c06\u989c\u8272\u9009\u9879\u6dfb\u52a0\u5230\u83dc\u5355\u4e2d\r\n    menubar.Append(colorMenu, \"&amp;Color\")\r\n\r\n    # \u521b\u5efa\u7ebf\u6761\u7c97\u7ec6\u83dc\u5355\r\n    thicknessMenu = wx.Menu()\r\n    thicknesses = &#91;\"1\", \"2\", \"4\", \"8\"]\r\n    thicknessRadioGroup = wx.Menu()\r\n\r\n    for index, thickness in enumerate(thicknesses):\r\n        thicknessRadioGroup.AppendRadioItem(-1, thickness)\r\n    thicknessMenu.Append(-1, \"&amp;Thickness\", thicknessRadioGroup)  # \u5c06\u7ebf\u6761\u7c97\u7ec6\u9009\u9879\u6dfb\u52a0\u5230\u83dc\u5355\u4e2d\r\n    menubar.Append(thicknessMenu, \"&amp;Thickness\")\r\n\r\n    self.SetMenuBar(menubar)  # \u5c06\u83dc\u5355\u680f\u8bbe\u7f6e\u5230\u7a97\u53e3\r\n\r\n    statusBar = self.CreateStatusBar()  # \u521b\u5efa\u72b6\u6001\u680f\r\n\r\n    saveFileDialog = wx.FileDialog(\r\n        self,\r\n        \"Save As\",\r\n        \"\",\r\n        \"\",\r\n        \"PNG (*.png)|*.png\",\r\n        wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,\r\n    )\r\n\r\n    def OnSave(event):\r\n        if saveFileDialog.ShowModal() == wx.ID_OK:\r\n            filename = saveFileDialog.GetPath()\r\n            bitmap = self.paintWindow.buffer.ConvertToImage()\r\n            bitmap.SaveFile(filename, wx.BITMAP_TYPE_PNG)\r\n\r\n    def OnColor(event):\r\n        selectedColorIndex = colorRadioGroup.GetSelection()\r\n        selectedColor = colors&#91;selectedColorIndex]\r\n        self.paintWindow.color = selectedColor\r\n        self.paintWindow.pen = wx.Pen(\r\n            self.paintWindow.color, self.paintWindow.thickness, wx.SOLID\r\n        )\r\n\r\n    def OnThickness(event):\r\n        selectedThicknessIndex = thicknessRadioGroup.GetSelection()\r\n        selectedThickness = thicknesses&#91;selectedThicknessIndex]\r\n        self.paintWindow.thickness = int(selectedThickness)\r\n        self.paintWindow.pen = wx.Pen(\r\n            self.paintWindow.color, self.paintWindow.thickness, wx.SOLID\r\n        )\r\n\r\n    self.Bind(wx.EVT_MENU, OnSave, saveItem)\r\n    self.Bind(wx.EVT_RADIOGROUP, OnColor, colorRadioGroup)\r\n    self.Bind(wx.EVT_RADIOGROUP, OnThickness, thicknessRadioGroup)\r\n\r\n    sizer = wx.BoxSizer(wx.VERTICAL)\r\n    sizer.Add(self.paintWindow, 1, wx.EXPAND)\r\n    self.SetSizer(sizer)\nif name == \"main\":\r\napp = wx.App()\r\nframe = PaintFrame()\r\nframe.Show()\r\napp.MainLoop()<\/code><\/pre>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>wxPython\u662f\u4e00\u4e2a\u57fa\u4e8ePython\u7684GUI\u5f00\u53d1\u6846\u67b6\uff0c\u5b83\u4f7f\u7528\u4e86wxWidgets C++\u5e93\u4f5c\u4e3a\u5176\u5e95\u5c42GUI\u5f15 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[14,10,7],"tags":[71,69,85],"class_list":["post-924","post","type-post","status-publish","format-standard","hentry","category-teacher","category-coding","category-software","tag-python","tag-learning","tag-exe","entry"],"_links":{"self":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/comments?post=924"}],"version-history":[{"count":0,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/924\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/media?parent=924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/categories?post=924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/tags?post=924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}