wxpython - wxPython 多个绘制函数
问题描述
我是 wxPython 的新手。我有两个函数可以生成不同的图形视图(在本例中简化为 DrawRect1 和 DrawRect2)。我想使用菜单在这两个视图之间切换。
我见过的大多数示例将 EVT_PAINT 绑定到一个名为 OnPaint 的函数,但我不明白如何定义可以链接到菜单选项的多个绘图函数。
在下面的代码中,我绘制了所需的矩形,但没有显示背景颜色,也没有出现错误。
我使用的是 ClientDC 而不是 PaintDC,因为我理解这是不同函数如何绘制到屏幕上的方式,而不是绑定了 EVT_PAINT 的单个函数。
我在代码中的方法是错误的吗?或者这只是刷新显示的问题?我正在尝试清除面板(通过重新创建它)然后在其上绘图(由于未显示背景颜色,因此无法正常工作)。
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title=title, size=(500, 300))
self.InitUI()
def InitUI(self):
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour(wx.Colour('RED'))
self.Centre()
self.Show(True)
menuBar = wx.MenuBar()
RectangleButton = wx.Menu()
Item1 = RectangleButton.Append(wx.ID_ANY, 'Rectangle 1')
Item2 = RectangleButton.Append(wx.ID_ANY, 'Rectangle 2')
menuBar.Append(RectangleButton, 'Rectangles')
self.SetMenuBar(menuBar)
self.Bind(wx.EVT_MENU, self.DrawRect1, Item1)
self.Bind(wx.EVT_MENU, self.DrawRect2, Item2)
def DrawRect1(self, e):
self.panel.Destroy()
self.panel = wx.Panel(self, size=self.GetClientSize())
self.dc = wx.ClientDC(self.panel)
self.panel.SetBackgroundColour(wx.Colour('BLUE'))
self.dc.DrawRectangle(10, 10, 100, 100)
def DrawRect2(self, e):
self.panel.Destroy()
self.panel = wx.Panel(self, size=self.GetClientSize())
self.dc = wx.ClientDC(self.panel)
self.panel.SetBackgroundColour(wx.Colour('GREEN'))
self.dc.DrawRectangle(20, 20, 50, 50)
myApp = wx.App()
Mywin(None,'Drawing demo')
myApp.MainLoop()
解决方案
在这里使用wx.ClientDC
是正确的做法,因为您想从菜单命令而不是wx.Paint
事件中绘制。
我想每次绘制时都不需要销毁/创建面板,所以我从代码中删除了这部分。
另外两点需要注意的是:
1.-您需要为画笔选择一种颜色,wx.CLientDC
因为默认情况下画笔颜色将与面板相同,从而导致不可见的矩形。这是通过以下行完成的:self.dc.SetBrush(wx.Brush(wx.Colour('white')))
2.-我self.Refresh()
self.Update()
在绘制矩形之前添加了一个调用以强制更改面板颜色,然后我使用wx.ClientDC
对象进行绘制。如果将 放在self.Refresh()
self.Update()
方法的末尾,则矩形消失。
这是代码:
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title=title, size=(500, 300))
self.InitUI()
def InitUI(self):
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour(wx.Colour('RED'))
self.Centre()
self.Show(True)
menuBar = wx.MenuBar()
RectangleButton = wx.Menu()
Item1 = RectangleButton.Append(wx.ID_ANY, 'Rectangle 1')
Item2 = RectangleButton.Append(wx.ID_ANY, 'Rectangle 2')
menuBar.Append(RectangleButton, 'Rectangles')
self.SetMenuBar(menuBar)
self.Bind(wx.EVT_MENU, self.DrawRect1, Item1)
self.Bind(wx.EVT_MENU, self.DrawRect2, Item2)
def DrawRect1(self, e):
self.panel.SetBackgroundColour(wx.Colour('BLUE'))
self.Refresh()
self.Update()
self.dc = wx.ClientDC(self.panel)
self.dc.SetBrush(wx.Brush(wx.Colour('white')))
self.dc.DrawRectangle(10, 10, 100, 100)
def DrawRect2(self, e):
self.panel.SetBackgroundColour(wx.Colour('GREEN'))
self.Refresh()
self.Update()
self.dc = wx.ClientDC(self.panel)
self.dc.SetBrush(wx.Brush(wx.Colour('white')))
self.dc.DrawRectangle(20, 20, 50, 50)
myApp = wx.App()
Mywin(None,'Drawing demo')
myApp.MainLoop()
推荐阅读
- java - 如何保护我的 Java AES 加密密钥
- c# - 从构造函数 NRE ASP.NET 传递的参数
- jquery - 如何通过选择输入中的值选择特定选项并为每个选项分配不同的功能?
- mongodb - Mongo shell 不在正在运行的数据库上创建索引
- flask - sqlalchemy.exc.InvalidRequestError:对象'
' 已附加到会话 '2'(这是 '3') - excel - 执行任何操作时启用宏的文件停止工作并崩溃
- comments - 如何在具有 C 类型语法的工作代码中嵌入 markdown 文档以进行注释?
- java - CDI - @Injected 字段为空
- php - Laravel 5.8 刷新数据库不丢失表中的数据已经存在
- java - 如何从 Java 中的 CSV 文件中获取最大值和最小值