Hallo tomate!tomate hat geschrieben:Wie kann ich es hinkriegen, dass on_panel_paint erst aufgerufen wird, wenn ich einen Button in der Toolbar anklicke?gerold hat geschrieben:Code: Alles auswählen
def on_panel_paint(self, event = None): dc = wx.PaintDC(self.panel)
Bin jetzt nicht sicher ob das weiterhilft, aber wenn du deine Paint-Methode erst beim dem Klicken des Buttons dem Event zuweist und danach ein Refresh() machst, wuerde das auch gehen. Ist es vielleicht was du willst?
Code: Alles auswählen
import wx
class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.SetClientSize((640, 480))
self.panel = wx.Panel(self)
self.btn = wx.Button(self.panel, -1, "CLICK!",
pos=(270, 220),
size=(100, 20)
)
#btn2 = wx.Button(self, -1, "CLICK!", pos=(200, 200))
self.btn.Bind(wx.EVT_BUTTON, self.on_button)
def on_button(self, evt):
self.panel.Bind(wx.EVT_PAINT, self.on_paint)
self.return_bmp(forced_refresh=True)
self.panel.Refresh()
def on_paint(self, evt):
wx.BufferedPaintDC(self.panel, self.return_bmp())
def return_bmp(self, forced_refresh=False):
if forced_refresh or not hasattr(self, "_buffer"):
self._buffer = wx.EmptyBitmap(*self.GetClientSize())
# hab mal mein Fieldset als Beispiel missbraucht
MARGIN = 10
TXT = "Hallo Welt!"
dc = wx.MemoryDC()
dc.SelectObject(self._buffer)
dc.Clear()
w, h = dc.GetSizeTuple()
TXTW = dc.GetTextExtent(TXT)[0] + MARGIN
TXTH = dc.GetTextExtent(TXT)[1]
lines = (
(MARGIN, MARGIN, 3*MARGIN, MARGIN),
(3*MARGIN+TXTW, MARGIN, w-MARGIN, MARGIN),
(MARGIN, MARGIN, MARGIN, h-MARGIN),
(w-MARGIN, MARGIN, w-MARGIN, h-MARGIN),
(MARGIN, h-MARGIN, w-MARGIN+1, h-MARGIN)
)
dc.DrawLineList(lines)
dc.DrawText(TXT, 3*MARGIN+MARGIN/2, MARGIN-TXTH/2)
dc.SelectObject(wx.NullBitmap)
return self._buffer
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = Frame(None)
frame.Show()
app.MainLoop()