我是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()
答案 0 :(得分:2)
在这里使用1557023292
是正确的选择,因为您想从菜单命令而不是1554052261
事件中绘制。
我想您每次绘制时都无需销毁/创建面板,因此我从代码中删除了该部分。
要注意的另外两件事是
1.-您需要为wx.ClientDC
的“画笔”选择一种颜色,因为默认情况下,“画笔”颜色将与面板相同,从而导致不可见的矩形。这是通过以下行完成的:wx.Paint
2.-在绘制矩形以强制更改面板颜色之前,我添加了一个wx.CLientDC
self.dc.SetBrush(wx.Brush(wx.Colour('white')))
调用,然后使用self.Refresh()
对象进行绘制。如果将self.Update()
wx.ClientDC
放在方法的末尾,则矩形消失。
代码如下:
self.Refresh()