更改画布ScaledTex的背景色

2024-05-19 12:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用wxPython Canvas'AddScaledTextBox(...)创建一个缩放文本框。在

请参见here示例:

Box = Canvas.AddScaledTextBox("A Two Line\nString",
                                  Point,
                                  2,
                                  BackgroundColor = "Yellow",
                                  LineColor = "Red",
                                  LineStyle = "Solid",
                                  PadSize = 5,
                                  Family = wx.TELETYPE,
                                  Position = 'bl')

定义文本框之后,如何更改背景色?(例如用户输入=>;背景颜色更改)


Tags: box示例herelinewxpythonredpointcanvas
2条回答

很肯定这是个虫子。请参见lines 1841 - 1845 in the wxPython source-有一个对self.BackgroundColor的引用,但从未使用过。在

因此,对于您的示例,您需要设置与文本框关联的画笔的颜色。我以罗宾·邓恩的例子为基础。函数SetBoxBackground是其中的重要部分。在

正如评论中所指出的,仅仅调用box.Brush.SetColour(color)box.Pen.SetColour(color)可能会导致问题:如果有两个文本框具有相同的颜色,更改其中一个的画笔/笔颜色也会影响另一个。(我不是100%确定,但我认为这是因为缓存,请参见示例this comment in the source。)

import wx
from wx.lib.floatcanvas import FloatCanvas

class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.canvas = FloatCanvas.FloatCanvas(self, BackgroundColor = "black")
        MainSizer = wx.BoxSizer(wx.VERTICAL)
        MainSizer.Add(self.canvas, 4, wx.EXPAND)
        self.SetSizer(MainSizer)
        self.box = self.canvas.AddScaledTextBox("A Two Line\nString",
                                  (0,10),
                                  2,
                                  BackgroundColor = "Yellow",
                                  LineColor = "Red",
                                  LineStyle = "Solid",
                                  PadSize = 5,
                                  Family = wx.TELETYPE,
                                  Position = 'bl')
        self.box2 = self.canvas.AddScaledTextBox("Second Box",
                                  (0,0),
                                  2,
                                  BackgroundColor = "Yellow",
                                  LineColor = "Red",
                                  LineStyle = "Solid",
                                  PadSize = 5,
                                  Family = wx.TELETYPE,
                                  Position = 'bl')
        self.box.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.OnRectDown)
        wx.CallAfter(self.canvas.ZoomToBB)

    def OnRectDown(self, event):
        print ('Rectangle: Left Button down clicked at:', event.HitCoords)
        if self.box.Color == 'red':
            self.SetBoxBackground('green', "Solid")
            self.box.SetColor('black')
        else:
            self.SetBoxBackground('white', "Solid")
            self.box.SetColor('red')
        self.canvas.ClearBackground()
        self.canvas.Refresh()
        self.canvas.Draw(True)

    def SetBoxBackground(self, color, style, linewidth=1):
        # See https://github.com/wxWidgets/wxPython/blob/master/wx/lib/floatcanvas/FloatCanvas.py#L1841

        # Create a new brush (fill) with specified color
        self.box.SetBrush(color, style)
        # Create a new pen (line) with specified color
        self.box.SetPen(color, style, linewidth)
        self.box.SetBackgroundColor(color) # Now this works correctly

app = wx.App(0)
frame = TestFrame(None, title="Test")
frame.Show(True)
app.MainLoop()

ScaledTextBox类从具有SetColor和{}方法的{}派生。在

代码:

import wx
from wx.lib.floatcanvas import FloatCanvas

class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.canvas = FloatCanvas.FloatCanvas(self, BackgroundColor = "black")
        MainSizer = wx.BoxSizer(wx.VERTICAL)
        MainSizer.Add(self.canvas, 4, wx.EXPAND)
        self.SetSizer(MainSizer)
        self.A = self.canvas.AddScaledTextBox('yoda', (0,0), Position = 'tl', Alignment = 'center', PadSize = 10, Size = 15, Width = 150, BackgroundColor = 'white')
        self.A.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.OnRectDown)
        wx.CallAfter(self.canvas.ZoomToBB)

    def OnRectDown(self, event):
        print 'Rectangle: Left Button down clicked at:', event.HitCoords
        if self.A.Color == 'red':
            self.A.SetColor('black')
        else:
            self.A.SetColor('red')
        self.canvas.Draw(True)

app = wx.App(0)
frame = TestFrame(None, title="Test")
frame.Show(True)
app.MainLoop()

编辑: 在颜色更改后强制重新绘制画布。另外,由于某些原因,更改背景色并不合适,所以我切换到演示更改文本颜色。在

删除了二级编辑,因为它只是创建一个新的文本框,而不是更新原始文本框。在

相关问题 更多 >