Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import wx
- class AutoSizeTextCtrl(wx.TextCtrl):
- AutoSizeStep = 1
- import wx.lib.newevent
- ShrinkEffectEvent, EVT_SHRINK_EVENT = wx.lib.newevent.NewEvent()
- GrowEffectEvent, EVT_GROW_EVENT = wx.lib.newevent.NewEvent()
- def __init__(self, parent, id=wx.ID_ANY, value=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name=wx.TextCtrlNameStr):
- # We will not be able to set the expanded widget height during GrowEffectEvent without an initial size.
- assert size[1] > 0
- self.FirstHeight = size[1]
- # Prevent processing of ShrinkEffectEvent and GrowEffectEvent at aame time.
- self.Shrinking = False
- self.Growing = False
- wx.TextCtrl.__init__(self, parent, id, value, pos, size, style, validator, name)
- self.Bind(AutoSizeTextCtrl.EVT_SHRINK_EVENT, self.onShrink)
- self.Bind(AutoSizeTextCtrl.EVT_GROW_EVENT, self.onGrow)
- def onShrink(self, event=None):
- current_width, current_height = self.GetSize()
- if current_height > 0 and not self.Growing:
- self.Shrinking = True
- current_height -= self.AutoSizeStep
- self.SetSize(-1, current_height)
- event = AutoSizeTextCtrl.ShrinkEffectEvent()
- wx.PostEvent(self, event)
- elif current_height <= 0:
- self.Shrinking = False
- def onGrow(self, event=None):
- current_width, current_height = self.GetSize()
- if current_height < self.FirstHeight and not self.Shrinking:
- self.Growing = True
- current_height += self.AutoSizeStep
- self.SetSize(-1, current_height)
- event = AutoSizeTextCtrl.GrowEffectEvent()
- wx.PostEvent(self, event)
- elif current_height >= self.FirstHeight:
- self.Growing = False
- class Frame(wx.Frame):
- def __init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name=wx.FrameNameStr):
- wx.Frame.__init__(self, parent, id, title, pos, size, style, name)
- panel = wx.Panel(self)
- self.ButtonShowWidget = wx.Button(panel, label="Show TextCtrl", name='showbutton')
- self.ButtonHideWidget = wx.Button(panel, label="Hide TextCtrl", name='hidebutton')
- button_sizer = wx.BoxSizer(wx.HORIZONTAL)
- button_sizer.Add(self.ButtonShowWidget, 0, wx.ALL, 10)
- button_sizer.Add(self.ButtonHideWidget, 0, wx.ALL, 10)
- self.AutoSizeTextCtrl = AutoSizeTextCtrl(panel, size=(-1,100), style=wx.TE_MULTILINE )
- panel_sizer = wx.BoxSizer(wx.VERTICAL)
- panel_sizer.Add(button_sizer, 0, wx.EXPAND | wx.ALL, 0)
- panel_sizer.Add(self.AutoSizeTextCtrl, 0, wx.EXPAND|wx.ALL)
- panel.SetSizer(panel_sizer)
- frame_sizer = wx.BoxSizer(wx.VERTICAL)
- frame_sizer.Add(panel, 1, wx.EXPAND|wx.ALL, 0)
- self.SetSizer(frame_sizer)
- self.Show()
- self.Bind(wx.EVT_BUTTON, self.onButton)
- def onButton(self, event):
- button = event.GetEventObject()
- name = button.GetName()
- # Here we start the Grow or Shrink Effect;
- # in this case in the parent widget with buttons
- if name == 'showbutton':
- event = AutoSizeTextCtrl.GrowEffectEvent()
- wx.PostEvent(self.AutoSizeTextCtrl, event)
- elif name == 'hidebutton':
- event = AutoSizeTextCtrl.ShrinkEffectEvent()
- wx.PostEvent(self.AutoSizeTextCtrl, event)
- if __name__ == "__main__":
- app = wx.App()
- frame = Frame(None, title='Auto-Grow-Widget')
- app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment