【问题标题】:Drawable scrollable window not rendering可绘制的可滚动窗口未呈现
【发布时间】:2021-08-27 08:22:30
【问题描述】:

我正在做一个项目,我想在 ScrolledWindow 内的位图上绘制内容。

它工作正常,我可以画线,但是当我滚动窗口并尝试画一些东西时,它没有渲染。新绘制的线只会在我“移开”(如滚动回 0、0)然后回来时才会呈现。

我遇到了一些关于 SO 的(相当老的)问题,但似乎没有人遇到过这个问题。

这是一个示例代码示例:

import wx


class MainFrame(wx.Frame):

    def __init__(self, *args, **kw):
        wx.Frame.__init__(self, *args, **kw)
        s = wx.BoxSizer(wx.VERTICAL)
        panel = DrawablePanel(self)
        s.Add(panel, 1, wx.EXPAND)
        self.SetSizer(s)
        self.SetSize(400, 400)


class DrawablePanel(wx.ScrolledWindow):

    def __init__(self, parent):
        super().__init__(parent, id=wx.ID_ANY)
        self.SetScrollbars(10, 10, 100, 100)

        self.buffer = wx.Bitmap((1000, 1000))
        cdc = wx.ClientDC(self)
        self.DoPrepareDC(cdc)
        dc = wx.BufferedDC(cdc, self.buffer)
        dc.Clear()

        self.mouse_pos = None

        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
        self.Bind(wx.EVT_MOTION, self.on_motion)

    def on_paint(self, evt):
        wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA)

    def on_mouse_down(self, evt):
        self.mouse_pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get()

    def on_motion(self, evt):
        if evt.Dragging() and evt.LeftIsDown():
            new_pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get()
            coord = self.mouse_pos + new_pos
            client_device = wx.ClientDC(self)
            self.DoPrepareDC(client_device)
            dc = wx.BufferedDC(client_device, self.buffer)
            dc.DrawLine(*coord)
            self.mouse_pos = new_pos


if __name__ == "__main__":
    app = wx.App()
    wx.InitAllImageHandlers()
    MainFrame(None).Show()
    app.MainLoop()

任何帮助将不胜感激。 提前致谢,

杰里米

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    只需为面板窗口添加一个“刷新”命令:

    刷新(self,eraseBackground=True,rect=None) 导致此窗口及其所有子窗口被递归重绘。

    def on_motion(self, evt):
        if evt.Dragging() and evt.LeftIsDown():
            new_pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get()
            coord = self.mouse_pos + new_pos
            client_device = wx.ClientDC(self)
            self.DoPrepareDC(client_device)
            dc = wx.BufferedDC(client_device, self.buffer)
            dc.DrawLine(*coord)
            self.mouse_pos = new_pos
        self.Refresh()
    

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2017-07-19
      相关资源
      最近更新 更多