Skip to main content
 首页 » 编程设计

python之如何在 wxpython 中使用带有 wx.ColourDialog 的刷新

2025年05月04日8mayingbao

我正在尝试 Refresh() 一个使用 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() 

请您参考如下方法:

我稍微清理了你的代码。基本上,当您在每个大小事件之后创建(和删除)不同的 dc 实例时,您的全局变量会产生一些问题。
如果不是绝对必要(很少是必要的),则不应使用全局变量。

这个有效:

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()