gpt4 book ai didi

python - 无法让 wx.BufferedDC 绘制任何东西

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:48 25 4
gpt4 key购买 nike

我对 DC 有疑问。我正在尝试制作一个将在屏幕上绘制许多线条并且需要非常快速更新的应用程序,并且由于我不想要闪烁,所以我决定尝试一下缓冲 dc。但是当我运行这段代码时,它什么也没有画。我做错了什么?

import wx

class MainFrame(wx.Frame):
def __init__(self):
screensize = wx.GetDisplaySize()
self.framesize = (screensize[0]/4*3, screensize[1]/4*3)
wx.Frame.__init__(self, None, -1, "CursorTracker", size=self.framesize,
style=wx.SYSTEM_MENU|
wx.CAPTION|
wx.CLOSE_BOX|
wx.MINIMIZE_BOX)
self.dc = wx.ClientDC(self)
self.bdc = wx.BufferedDC(self.dc)
self.SetBackgroundColour(wx.WHITE)
self.Timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer)
self.Timer.Start(100)

def OnTimer(self, event):

self.bdc.DrawLine(1,1,100,100)


class App(wx.App):
def OnInit(self):
frame = MainFrame()
frame.Show()
return True

app = App(redirect=False)
app.MainLoop()

最佳答案

我使用过 AutoBufferedPaintDC,但我发现使用 MemoryDC 进行我自己的双缓冲更加灵活。这里有一个模板供您使用。

import wx

class Frame(wx.Frame):
def __init__(self):
super(Frame, self).__init__(None, -1, 'CursorTracker')
self.mdc = None # memory dc to draw off-screen
self.Bind(wx.EVT_SIZE, self.on_size)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.on_erase)
self.Bind(wx.EVT_PAINT, self.on_paint)
w, h = wx.GetDisplaySize()
w, h = w * 3 / 4, h * 3 / 4
self.SetSize((w, h))
self.Center()
self.on_timer()
def on_size(self, event):
# re-create memory dc to fill window
w, h = self.GetClientSize()
self.mdc = wx.MemoryDC(wx.EmptyBitmap(w, h))
self.redraw()
def on_erase(self, event):
pass # don't do any erasing to avoid flicker
def on_paint(self, event):
# just blit the memory dc
dc = wx.PaintDC(self)
if not self.mdc:
return
w, h = self.mdc.GetSize()
dc.Blit(0, 0, w, h, self.mdc, 0, 0)
def on_timer(self):
# refresh every N milliseconds
self.redraw()
wx.CallLater(100, self.on_timer)
def redraw(self):
# do the actual drawing on the memory dc here
dc = self.mdc
w, h = dc.GetSize()
dc.Clear()
dc.DrawLine(0, 0, w, h)
self.Refresh()

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = Frame()
frame.Show()
app.MainLoop()

基本方法是:

  • 为离屏绘图创建一个内存dc
  • 如果窗口被调整大小,调整内存dc的大小并重绘
  • 当一个paint事件发生时,将内存dc blit到paint dc上
  • 对删除背景事件不执行任何操作以避免闪烁
  • 当且仅当您确实需要更改屏幕上的内容时才调用重绘

如果您存储对在 on_size 中创建的 EmptyBitmap 的引用,您甚至可以使用 wxBitmap.SaveFile() 将窗口内容保存到图像文件

关于python - 无法让 wx.BufferedDC 绘制任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com