[wxpython-users] XRC-Problem: How to replace an object from the xrc-tree after creation

wxPython user mailing list, post #18,400
Author:
Date:
Subject:
 Christian Weickhmann
 2008-07-16 17:11:49
 [wxpython-users] XRC-Problem: How to replace an object from the xrc-tree after creation
Hi,

I've searched for hours now and found nothing on how to replace a Widget in an XRC-Tree.
Here is, what I want to do:
1.) I have written a custom Widget "Grating" inherited from wxPanel which works fine when loaded into a programm not using xrc.
2.) I'd like to replace an empty wxPanel which I put into the XRC-layout as a place holder by my custom widget.

This is on-the-fly but as far as I know it's the only way not to write the "Grating" in C an plug it into XRC. Is there any possibility to get the object and replace it by my custom one?

The Grating (Grating.py), XRC (rodisui.xml) and the app (wxtest.py) are appended.

Thank you!
Christian
--
GMX startet ShortView.de. Hier findest Du Leute mit Deinen Interessen!
Jetzt dabei sein: http://www.shortview.de/wasistshortview.php?mc=sv_ext_mf@gmx
#!/usr/bin/python2.5

import wx
from wx import xrc
import wx.lib.newevent

(EdgeMovedEvent, EVT_EDGE_MOVED) = wx.lib.newevent.NewEvent()

class Grating(wx.Panel):
def __init__(self, parent, id):
wx.Panel.__init__(self, parent, id, size=(-1, 100), style=wx.SIMPLE_BORDER)
self.parent = parent
self.font = wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
wx.FONTWEIGHT_NORMAL, False, 'Courier 10 Pitch')

self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)

self.r = 7
self.x = [0.1, 0.2, 0.9, 0.8]
self.y = [0.0, 1.0, 1.0, 0.0]

self.dragging = -1

def OnPaint(self, event):
dc = wx.PaintDC(self)
dc.SetFont(self.font)
w, h = self.GetSize()
h=h-1

stepx = int(round(w / 10.0))
stepy = int(round(h / 10.0))

dc.SetPen(wx.Pen('#000000'))
dc.DrawCirclePoint([round(self.x[0]*float(w)),0], self.r)
dc.DrawCirclePoint([round(self.x[1]*float(w)),h], self.r)
dc.DrawCirclePoint([round(self.x[2]*float(w)),0], self.r)
dc.DrawCirclePoint([round(self.x[3]*float(w)),h], self.r)

dc.SetPen(wx.Pen('#FF0000'))
dc.SetBrush(wx.Brush('#FF0000', wx.BDIAGONAL_HATCH))
dc.DrawPolygon([[0,0], [0,h], [round(self.x[1]*float(w)),h], [round(self.x[0]*float(w)),0]])
dc.SetPen(wx.Pen('#00FF00'))
dc.SetBrush(wx.Brush('#00FF00', wx.BDIAGONAL_HATCH))
dc.DrawPolygon([[round(self.x[1]*float(w)),h], [round(self.x[0]*float(w)),0], [round(self.x[2]*float(w)),0], [round(self.x[3]*float(w)),h]])
dc.SetPen(wx.Pen('#FF0000'))
dc.SetBrush(wx.Brush('#FF0000', wx.BDIAGONAL_HATCH))
dc.DrawPolygon([[w,0], [w,h], [round(self.x[3]*float(w)),h], [round(self.x[2]*float(w)),0]])

dc.SetPen(wx.Pen('#303030'))
for i in range(1, 10):
dc.DrawLine(i*stepx, 0, i*stepx, 6)
width, height = dc.GetTextExtent(str(float(i)/10))
dc.DrawText(str(float(i)/10), i*stepx-width/2, 8)
dc.DrawLine(0, i*stepy, 6, i*stepy)
width, height = dc.GetTextExtent(str(float(i)/10))
dc.DrawText(str(float(i)/10), 8, i*stepy-height/2)

def OnMouseMove(self, event):
if event.Dragging() and event.LeftIsDown():
x, y = event.GetPosition()
w, h = self.GetSize()
if (x-round(self.x[0]*float(w)))**2+(y)**2 <= (self.r)**2:
self.dragging = 0
if (x-round(self.x[1]*float(w)))**2+(y-h)**2 <= (self.r)**2:
self.dragging = 1
if (x-round(self.x[2]*float(w)))**2+(y)**2 <= (self.r)**2:
self.dragging = 2
if (x-round(self.x[3]*float(w)))**2+(y-h)**2 <= (self.r)**2:
self.dragging = 3
if self.dragging > -1:
self.x[self.dragging] = float(x)/float(w)
if self.x[self.dragging] > 1:
self.x[self.dragging] = 1
if self.x[self.dragging] < 0:
self.x[self.dragging] = 0
if self.x[0] > self.x[2]:
self.x[2] = self.x[0]
if self.x[1] > self.x[3]:
self.x[3] = self.x[1]
event = EdgeMovedEvent()
event.x = self.x
self.ProcessEvent(event)
self.Refresh()
else:
self.dragging = -1

def OnSize(self, event):
self.Refresh()

def GetX(self):
return self.x

def SetX(self, x=[0.1, 0.2, 0.8, 0.9]):
self.x = x

#!/usr/bin/python2.5

import wx
import sys
from wx import xrc
import Grating

class wxRodisGUI(wx.App):
def OnInit(self):
self.res = xrc.XmlResource("rodisui.xml")
self.InitFrame()
self.InitActions()
self.InitEverythingElse()
return True
def InitFrame(self):
self.frame = self.res.LoadFrame(None, "rodis_frame")
self.panel = xrc.XRCCTRL(self.frame, "m_scrolledWindow2")
self.ew_freq = xrc.XRCCTRL(self.panel, "ew_freq")
self.b_freq_min = xrc.XRCCTRL(self.panel, "b_freq_min")
self.b_freq_max = xrc.XRCCTRL(self.panel, "b_freq_max")
self.ew_raummoden = xrc.XRCCTRL(self.panel, "ew_raummoden")
self.b_raummoden_min = xrc.XRCCTRL(self.panel, "b_raummoden_min")
self.b_raummoden_max = xrc.XRCCTRL(self.panel, "b_raummoden_max")
self.ew_schichten = xrc.XRCCTRL(self.panel, "ew_schichten")
self.b_schichten_min = xrc.XRCCTRL(self.panel, "b_schichten_min")
self.b_schichten_max = xrc.XRCCTRL(self.panel, "b_schichten_max")


def InitActions(self):
self.frame.Bind(wx.EVT_MENU, self.Exit, id=xrc.XRCID("m_datei_exit"))
self.frame.Bind(wx.EVT_CHECKBOX, self.SwitchFreq, id=xrc.XRCID("freq_ew_b"))
self.frame.Bind(wx.EVT_CHECKBOX, self.SwitchRaummoden, id=xrc.XRCID("raummoden_ew_b"))
self.frame.Bind(wx.EVT_CHECKBOX, self.SwitchSchichten, id=xrc.XRCID("schichten_ew_b"))

def InitEverythingElse(self):
sizer = self.panel.GetSizer()
sizer.Fit(self.frame)
sizer.SetSizeHints(self.frame)
self.frame.Show()
def InitArgs(self):
try:
self.f0 = float(self.ew_freq.GetValue())
except ValueError:
return self.BadFloatValue(self.ew_freq)
try:
self.fmin = float(self.b_freq_min.GetValue())
except ValueError:
return self.BadFloatValue(self.b_freq_min)
try:
self.fmax = float(self.b_freq_max.GetValue())
except ValueError:
return self.BadFloatValue(self.b_freq_max)
return True

def BadFloatValue(self, control):
dlg = wx.MessageDialog(self.frame, "I can't convert this to float.",
'Conversion error', wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
control.SetFocus()
control.SetSelection(-1, -1)
return False

def SwitchFreq(self, evt):
if self.ew_freq.IsEnabled():
self.ew_freq.Disable()
self.b_freq_min.Enable()
self.b_freq_max.Enable()
else:
self.ew_freq.Enable()
self.b_freq_min.Disable()
self.b_freq_max.Disable()

def SwitchRaummoden(self, evt):
if self.ew_raummoden.IsEnabled():
self.ew_raummoden.Disable()
self.b_raummoden_min.Enable()
self.b_raummoden_max.Enable()
else:
self.ew_raummoden.Enable()
self.b_raummoden_min.Disable()
self.b_raummoden_max.Disable()

def SwitchSchichten(self, evt):
if self.ew_schichten.IsEnabled():
self.ew_schichten.Disable()
self.b_schichten_min.Enable()
self.b_schichten_max.Enable()
else:
self.ew_schichten.Enable()
self.b_schichten_min.Disable()
self.b_schichten_max.Disable()


def Add(self, evt):
if self.InitArgs():
self.result.SetValue(str(self.first + self.second))
def Subtract(self, evt):
if self.InitArgs():
self.result.SetValue(str(self.first - self.second))
def Multiply(self, evt):
if self.InitArgs():
self.result.SetValue(str(self.first * self.second))
def Divide(self, evt):
if self.InitArgs():
if self.second != 0:
self.result.SetValue(str(self.first / self.second))
else:
self.result.SetValue("#ERROR")
def Exit(self, evt):
self.Destroy()
sys.exit()

def main():
app = wxRodisGUI(0)
app.MainLoop()
if __name__ == '__main__':
main()
_______________________________________________
wxpython-users mailing list
[email protected]
http://lists.wxwidgets.org/mailman/listinfo/wxpython-users