Как использовать Refresh с wx.ColourDialog в wxpython? - PullRequest
2 голосов
/ 07 января 2012

Я пытаюсь обновить () панель, которая использует wx.ColourDialog.Как только я обновляю панель один раз, она не может обновиться снова.Попробуйте следующее, чтобы увидеть проблему в действии.

Нажав на кнопку, он спросит вас, на какой цвет вы хотите изменить прямоугольник.Как только вы нажмете ОК, он должен изменить цвет прямоугольников.Это не будет работать, это не изменит прямоугольник.

import wx 
xcolor_of_font_dia=(0,0,0)
class MyFrame(wx.Frame): 
    """a frame with a panel"""
    def __init__(self, parent=None, id=wx.ID_ANY, title=None):
        global xcolor_of_font_dia
        global dc
        wx.Frame.__init__(self, parent, wx.ID_ANY, title) 
        self.panel = wx.Panel(self, size=(350, 200)) 
        self.panel.Bind(wx.EVT_PAINT, self.on_paint)
        self.button2 = wx.Button(self.panel, id=wx.ID_ANY, label='Button2',pos=(8, 38), size=(175, 28))
        self.button2.Bind(wx.EVT_BUTTON, self.onColorDlg)
        self.Fit() 
    def onColorDlg(self, event):
        global xcolor_of_font_dia
        global dc
        """
        This is mostly from the wxPython Demo!
        """
        dlg = wx.ColourDialog(self)

        # Ensure the full colour dialog is displayed, 
        # not the abbreviated version.
        dlg.GetColourData().SetChooseFull(True)

        if dlg.ShowModal() == wx.ID_OK:
            data = dlg.GetColourData()
            print 'You selected: %s\n' % str(data.GetColour().Get())
            xcolor_of_font_dia='#%02x%02x%02x' % data.GetColour().Get()
        dlg.Destroy()
        self.panel.Refresh()
    def on_paint(self, event):
        global xcolor_of_font_dia
        global dc
        dc = wx.PaintDC(self.panel)
        dc.SetPen(wx.Pen(xcolor_of_font_dia, 1))
        rect = wx.Rect(50, 50, 100, 100) 
        dc.DrawRoundedRectangleRect(rect, 8)


# test it ...
app = wx.PySimpleApp() 
frame1 = MyFrame(title='rounded-rectangle & circle') 
frame1.Center() 
frame1.Show() 
app.MainLoop()

1 Ответ

1 голос
/ 07 января 2012

Я немного почистил твой код.В основном ваши глобальные переменные вызывали некоторые проблемы, поскольку вы создавали (и удаляли) разные экземпляры постоянного тока после каждого события размера.
Не следует использовать глобальные переменные, если это не является строго необходимым (редко бывает).

Это работает:

import wx 


class MyFrame(wx.Frame): 
    """a frame with a panel"""
    def __init__(self, parent=None, id=wx.ID_ANY, title=None):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title) 
        self.xcolor = (0, 0, 0)
        self.panel = wx.Panel(self, size=(350, 200)) 
        self.panel.Bind(wx.EVT_PAINT, self.on_paint)
        self.button2 = wx.Button(self.panel, id=wx.ID_ANY, label='Button2',
                                             pos=(8, 38), size=(175, 28))
        self.button2.Bind(wx.EVT_BUTTON, self.onColorDlg)

        self.Fit() 

    def onColorDlg(self, event):
        """
        This is mostly from the wxPython Demo!
        """
        dlg = wx.ColourDialog(None)
        dlg.GetColourData().SetChooseFull(True)

        if dlg.ShowModal() == wx.ID_OK:
            data = dlg.GetColourData()
            self.xcolor = data.GetColour().Get()
            print 'You selected: %s\n' % str(self.xcolor)

        dlg.Destroy()
        self.panel.Refresh()

    def on_paint(self, event):
        dc = wx.PaintDC(self.panel)
        dc.SetPen(wx.Pen(self.xcolor, 2))
        rect = wx.Rect(50, 50, 100, 100) 
        dc.DrawRoundedRectangleRect(rect, 8)


# test it ...
app = wx.PySimpleApp() 
frame1 = MyFrame(title='rounded-rectangle & circle') 
frame1.Center() 
frame1.Show() 
app.MainLoop()
...