Функции многократного рисования wxPython - PullRequest
2 голосов
/ 24 апреля 2019

Я новичок в 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()

1 Ответ

3 голосов
/ 24 апреля 2019

Использование 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...