Merkwürdiges Verhalten bei Doppelclick auf disabled Splitter
Verfasst: Dienstag 29. Juli 2008, 12:24
Der folgende Code bildet ein normales Frame mit 2 SplitterWindows und 3 Panels). Alles funktioniert erwartungsgemäß. Die Sashbalken lassen sich verschieben und die Panels ´wachsen´ mit der Vergrößerung des Frame-Borders.
Danach Klicke auf Button "Disable Hsplitter".
Alles funktioniert wie es sollte (Sashs, Borderänderung)
Versuche nun ein Doppelklick auf eines der rechten SplitterWindows mit den ListCtrls.
Die SplitterWindows sind plötzlich weg, d.h. unsichtbar geworden, aber nicht gelöscht (destroyed).
Mit einem Klick auf Button "Show Splitter" kann man sie wieder sichtbar werden lassen.
Doch fehlt der vertikale Sashbalken, der Sashbalken der hsplitter ist da und funktioniert normal. Verschiebe nun den Boder des Frames und siehe da der hsplitter wächst nicht mehr mit. Weitere Veränderungen des Frame-Border verbergen noch weitere Überraschungen.
Hat jemand hierfür eine Erklärung parat ?
ElSids
Danach Klicke auf Button "Disable Hsplitter".
Alles funktioniert wie es sollte (Sashs, Borderänderung)
Versuche nun ein Doppelklick auf eines der rechten SplitterWindows mit den ListCtrls.
Die SplitterWindows sind plötzlich weg, d.h. unsichtbar geworden, aber nicht gelöscht (destroyed).
Mit einem Klick auf Button "Show Splitter" kann man sie wieder sichtbar werden lassen.
Doch fehlt der vertikale Sashbalken, der Sashbalken der hsplitter ist da und funktioniert normal. Verschiebe nun den Boder des Frames und siehe da der hsplitter wächst nicht mehr mit. Weitere Veränderungen des Frame-Border verbergen noch weitere Überraschungen.
Hat jemand hierfür eine Erklärung parat ?
ElSids
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import wx
class PanelLeft(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
self.SetBackgroundColour("red")
vbox = wx.BoxSizer(wx.VERTICAL)
self.btn_disable = wx.Button(self,-1,u"Disable Hsplitter")
self.btn_show = wx.Button(self,-1, u"Show Splitter")
vbox.Add(self.btn_disable, 0, wx.ALL,10)
vbox.Add(self.btn_show, 0, wx.ALL,10)
self.SetSizer(vbox)
self.Bind(wx.EVT_BUTTON, self.OnDisable, self.btn_disable)
self.Bind(wx.EVT_BUTTON, self.OnShow, self.btn_show)
def GetHsplitter(self):
app = wx.GetApp()
hsplitter = app.insert_frame.hsplitter
return hsplitter
def OnDisable(self, evt):
hsplitter = self.GetHsplitter()
hsplitter.Enable(False)
def OnShow(self, evt):
hsplitter = self.GetHsplitter()
hsplitter.Show(True)
hsplitter.Enable(True)
hsplitter.Refresh()
class RightTop(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("blue")
self.columns = [u"top_head1", u"top_head2", u"top_head3"]
self.elenco = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.elenco,1,wx.GROW | wx.ALL,10)
self.SetSizer(vbox)
self.FillList()
def FillList(self):
for col, text in enumerate(self.columns):
self.elenco.InsertColumn(col, text)
self.elenco.SetColumnWidth(0, 80)
self.elenco.SetColumnWidth(1, 80)
self.elenco.SetColumnWidth(2, 80)
class RightBottom(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("green")
self.columns = [u"btm_head1", u"btm_head2", u"btm_head3"]
self.elenco2 = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.elenco2,1,wx.GROW | wx.ALL,10)
self.SetSizer(vbox)
self.FillList()
def FillList(self):
for col, text in enumerate(self.columns):
self.elenco2.InsertColumn(col, text)
self.elenco2.SetColumnWidth(0, 80)
self.elenco2.SetColumnWidth(1, 80)
self.elenco2.SetColumnWidth(2, 80)
class MainFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(
self, parent, id, title="MainFrame", size = (500,400),
style = wx.DEFAULT_FRAME_STYLE)
main_panel = wx.Panel(self)
main_border = wx.BoxSizer(wx.VERTICAL)
main_panel.SetSizer(main_border)
main_panel.SetBackgroundColour("white")
self.vsplitter = wx.SplitterWindow(main_panel, -1,
style= wx.SP_3D | wx.SP_BORDER)
self.hsplitter = wx.SplitterWindow(self.vsplitter, -1,
style = wx.SP_3D | wx.SP_BORDER)
self.left_pane = PanelLeft(self.vsplitter)
self.top_pane = RightTop(self.hsplitter)
self.bottom_pane = RightBottom(self.hsplitter)
self.hsplitter.SplitHorizontally(self.top_pane, self.bottom_pane)
self.vsplitter.SplitVertically(self.left_pane, self.hsplitter)
main_border.Add(self.vsplitter, 1, wx.GROW | wx.ALL)
class MyApp(wx.PySimpleApp):
def OnInit(self):
self.show_insert_frame()
return True
def show_insert_frame(self):
self.insert_frame = MainFrame(None,-1)
self.insert_frame.Show()
app=MyApp()
app.MainLoop()