Cześć Chcę narysować kolorowe linie wewnątrz staticbox, użyłem metody OdaNa, ale linia nie pojawiła się wewnątrz statycznego pudełka, a potem próbowałem utworzyć linię statyczną, to działało, ale nie mogę zmienić koloru Linia statyczna. Czy inny sposób pokazuje linię metodą Odania lub coś innego, a jak mogę to zrobić?

Oto przykładowy kod:

import wx

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.frame = parent

        wx.StaticBox(self, -1, 'Example', (5, 30), size=(290, 185))

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        #self.line = wx.StaticLine(self,-1, (25, 150), (100,1))
        #self.line.SetForegroundColour(("blue"))

    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        dc.DrawLine(50, 10, 80, 10)
        dc.DrawLine(50, 140, 80, 140)
        dc.DrawLine(50, 300, 80, 300)

class MainFrame(wx.Frame): 

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Window",size=(305,430))
        panel = MainPanel(self)
        self.CenterOnParent()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()
3
user2971990 3 grudzień 2013, 17:13

2 odpowiedzi

Najlepsza odpowiedź

Rzeczy jest to, że malujesz na panelu, a następnie statyczne pudełko. Możesz utworzyć niestandardowe pole statyczne i zrób to, co chcesz, a następnie zadzwoń do oryginalnego wx.StaticBox.OnPaint jak:

# custom StaticBox class
class MyStaticBox(wx.StaticBox):
  def __init__(self, *args, **kwargs):
    super(MyStaticBox, self).__init__(*args, **kwargs)
    self.Bind(wx.EVT_PAINT, self.OnPaint)

  def OnPaint(self, event):
    # do what you want here
    width, height = self.GetSize()
    dc = wx.PaintDC(self)
    dc.Clear()
    dc.SetPen(wx.Pen('#4285F4'))
    dc.DrawLine(0, 0, width, height)
    dc.DrawLine(width, 0, 0, height)
    # after you finished, call the StaticBox OnPaint
    super(MyStaticBox, self).OnPaint(event)

Na przykład:

import wx

# custom StaticBox class
class MyStaticBox(wx.StaticBox):
  def __init__(self, *args, **kwargs):
    super(MyStaticBox, self).__init__(*args, **kwargs)
    self.Bind(wx.EVT_PAINT, self.OnPaint)

  def OnPaint(self, event):
    # do what you want here
    width, height = self.GetSize()
    dc = wx.PaintDC(self)
    dc.Clear()
    dc.SetPen(wx.Pen('#4285F4'))
    dc.DrawLine(0, 0, width, height)
    dc.DrawLine(width, 0, 0, height)
    # after you finished, call the StaticBox OnPaint
    super(MyStaticBox, self).OnPaint(event)

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.frame = parent

        MyStaticBox(self, -1, 'Example', (5, 30), size=(290, 185))

        #self.line = wx.StaticLine(self,-1, (25, 150), (100,1))
        #self.line.SetForegroundColour(("blue"))

class MainFrame(wx.Frame): 

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Window",size=(305,430))
        panel = MainPanel(self)
        self.CenterOnParent()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

Example

2
user1129665user1129665 3 grudzień 2013, 14:47

Podejrzewam, że twój problem polega na tym, że nie ustawiasz pióra z koloru przed rysowaniem - może to spowodować białą linię zerowej szerokości na białym tle. Spróbuj dodawać

self.SetBackgroundColour(wx.WHITE)
dc.Clear()
dc.SetPen(wx.Pen("BLACK", 2))

Do funkcji OnPaint.

Inną rzeczą, która ma być jasna, jest to, że statyczne pudełko to pudełko rysować coś - rysujesz na panelu nie do pudełka.

0
Steve Barnes 3 grudzień 2013, 13:35