python - 更改 Canvas ScaledText 的背景颜色

标签 python canvas wxpython wxwidgets

我正在使用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')

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

最佳答案

很确定这是一个错误。请参阅lines 1841 - 1845 in the wxPython source - 有一个对 self.BackgroundColor 的引用,但从未使用过。

因此,对于您的示例,您需要设置与文本框关联的画笔的颜色。我根据 Robin Dunn 的示例编写了以下内容。函数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()

关于python - 更改 Canvas ScaledText 的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070918/

相关文章:

python - 编写一个名为拼写校正器的函数。

.net - 更改 Canvas 内控件的位置后,滚动条不可见

python - 在鼠标单击下获取 wxpython slider 的值

python - python中的浏览函数

python - 如果没有从主模块调用 wx.app.mainloop,线程将无法启动

python - 如何判断 python 的 ZipFile.writestr() 是否因为文件已满而失败?

python - Python 中的有序字典

python - 使用 openpyxl 时出现 "Bad magic number for file header"错误

javascript - 使用 setTimeout 顺序填充 Canvas 中的形状

javascript - 将 SVG 转换为 PNG,并将应用图像作为 svg 元素的背景