Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script by XtraNine
import sys
import wx
from wx.lib.splitter import MultiSplitterWindow
def create(parent, __DEBUG=False):
return MainFrame(parent, __DEBUG)
wxID_MAINFRAME = wx.NewId()
class LayoutWindow (wx.Panel):
def __init__(self, parent, Orientation, sashSize, style):
wx.Panel.__init__(self, parent, style=style|wx.FULL_REPAINT_ON_RESIZE)
self.ID_WINDOW_TOP = wx.NewId() # ID reserviert. Wird momentan nicht gebraucht.
self.ID_WINDOW_LEFT1 = wx.NewId()
self.ID_WINDOW_RIGHT1 = wx.NewId()
self.ID_WINDOW_BOTTOM = wx.NewId() # ID reserviert. Wird momentan nicht gebraucht.
# wx.LAYOUT_HORIZONTAL or wx.LAYOUT_VERTICAL
self.Orientation = Orientation
if Orientation == wx.LAYOUT_HORIZONTAL:
self.wxSize = wx.Size(1000, sashSize) # 30
self.leftWindow_SetAlignment = wx.LAYOUT_TOP
self.leftWindow_SetSashVisible = wx.SASH_BOTTOM
self.rightWindow_SetAlignment = wx.SASH_BOTTOM
self.rightWindow_SetSashVisible = wx.LAYOUT_TOP
else:
self.wxSize = (sashSize, 1000) # 220
self.leftWindow_SetAlignment = wx.LAYOUT_LEFT
self.leftWindow_SetSashVisible = wx.SASH_RIGHT
self.rightWindow_SetAlignment = wx.SASH_RIGHT
self.rightWindow_SetSashVisible = wx.LAYOUT_LEFT
# Fenster Links
self.leftWindow = wx.SashLayoutWindow(self, self.ID_WINDOW_LEFT1, wx.DefaultPosition,
wx.Size(200, 1000), wx.NO_BORDER |
wx.SW_3D | wx.CLIP_CHILDREN)
self.leftWindow.SetDefaultSize(self.wxSize)
self.leftWindow.SetOrientation(Orientation)
self.leftWindow.SetAlignment(self.leftWindow_SetAlignment)
self.leftWindow.SetSashVisible(self.leftWindow_SetSashVisible, True)
self.leftWindow.SetExtraBorderSize(10)
# Fenster Rechts
self.rightWindow = wx.SashLayoutWindow(self, self.ID_WINDOW_RIGHT1, wx.DefaultPosition,
wx.Size(200, 1000), wx.NO_BORDER |
wx.SW_3D | wx.CLIP_CHILDREN)
self.rightWindow.SetDefaultSize(self.wxSize)
self.rightWindow.SetOrientation(Orientation)
self.rightWindow.SetAlignment(self.rightWindow_SetAlignment)
self.rightWindow.SetSashVisible(self.rightWindow_SetSashVisible, True)
self.rightWindow.SetExtraBorderSize(10)
# Bindings
self.leftWindow.Bind(wx.EVT_SASH_DRAGGED_RANGE, self.OnFoldPanelBarDrag,
id=self.ID_WINDOW_TOP, id2=self.ID_WINDOW_BOTTOM)
self.Bind(wx.EVT_SIZE, self.OnSize)
def OnFoldPanelBarDrag(self, event):
if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
return
if event.GetId() == self.ID_WINDOW_LEFT1:
if self.Orientation != wx.LAYOUT_HORIZONTAL:
self.leftWindow.SetDefaultSize(wx.Size(event.GetDragRect().width, 1000))
else:
self.leftWindow.SetDefaultSize((1000, event.GetDragRect().height))
print "Debug: LayoutWindow->OnFoldPanelBarDrag()"
# Refreshen
wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow)
self.rightWindow.Refresh()
event.Skip()
def OnSize(self, event):
wx.LayoutAlgorithm().LayoutWindow(self, self.rightWindow)
print "Debug: LayoutWindow->OnSize()"
event.Skip()
def GetIDs (self):
return "self.ID_WINDOW_TOP = %d | self.ID_WINDOW_LEFT1 = %d | " \
"self.ID_WINDOW_RIGHT1 = %d | self.ID_WINDOW_BOTTOM = %d" %(self.ID_WINDOW_TOP,
self.ID_WINDOW_LEFT1,
self.ID_WINDOW_RIGHT1,
self.ID_WINDOW_BOTTOM)
#------------------------------------------------------------------------------#
class MainFrame(wx.Frame):
def __PrintIDs (self):
if self.__DEBUG == True:
print "MainFrame:" \
"wxID_MAINFRAME = %d | self.wxID_HELPITEM_HELP %d | self.wxID_FILEITEM_FILE = %d | " \
"wxID_STATUSBAR1 = %d" %(
wxID_MAINFRAME,
self.wxID_HELPITEM_HELP,
self.wxID_FILEITEM_FILE,
self.wxID_STATUSBAR1)
print "LayoutWindow (self.mainLayoutWindow): ", self.mainLayoutWindow.GetIDs()
def __init_MenuBar (self):
# IDs erzeugen.
self.wxID_HELPITEM_HELP = wx.NewId()
self.wxID_FILEITEM_FILE = wx.NewId()
self.wxID_FILEITEM_CLOSE = wx.NewId()
# Menübar und die einzelnen Menüs "erzeugen".
self.File = wx.Menu(title=u'')
self.Help = wx.Menu(title=u'')
self.menuBar1 = wx.MenuBar()
# Mnüabschnite für self.File hinzufügen
self.File.Append(help=u'Neues Projekt erzeugen', id=self.wxID_FILEITEM_FILE,
kind=wx.ITEM_NORMAL, text=u'&Neue Datei')
self.File.Append(help=u'Projekt schließen', id=self.wxID_FILEITEM_CLOSE,
kind=wx.ITEM_NORMAL, text=u'&Datei schließen')
self.Bind(wx.EVT_MENU, self.OnFileItem_fileMenu,
id=self.wxID_FILEITEM_FILE)
self.Bind(wx.EVT_MENU, self.OnCloseItem_fileMenu,
id=self.wxID_FILEITEM_CLOSE)
# Mnüabschnite für self.Help hinzufügen
self.Help.Append(help=u'Hilfe anzeigen', id=self.wxID_HELPITEM_HELP,
kind=wx.ITEM_NORMAL, text=u'Hilfe')
self.Bind(wx.EVT_MENU, self.OnHelpItem_helpMenu,
id=self.wxID_HELPITEM_HELP)
# Menüs zum Menübar hinzufügen
self.menuBar1.Append(menu=self.File, title=u'Datei')
self.menuBar1.Append(menu=self.Help, title=u'Hilfe')
# Menü erzeugen
self.SetMenuBar(self.menuBar1)
def __init_StatusBar (self):
self.wxID_STATUSBAR1 = wx.NewId()
self.statusBar1 = wx.StatusBar(id=self.wxID_STATUSBAR1,
name='statusBar1', parent=self, style=0)
self.statusBar1.SetFieldsCount(1)
self.statusBar1.SetStatusText(number=0, text=u'')
self.statusBar1.SetStatusWidths([-1])
self.SetStatusBar(self.statusBar1)
def __init__(self, prnt, __DEBUG):
self.__DEBUG = __DEBUG
# Main Frame erzeugen.
wx.Frame.__init__(self, id=wxID_MAINFRAME, name='', parent=prnt,
pos=wx.Point(368, 256), size=wx.Size(800, 600),
style=wx.DEFAULT_FRAME_STYLE, title='xpg 0.01')
# Menü erzeugen.
self.__init_MenuBar()
# Statuszeile erzeugen.
self.__init_StatusBar()
#self.__PrintIDs()
#===============================================================================
# self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER)
# self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow,
# wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
#
#===============================================================================
#
# fileMenu
#
def OnFileItem_fileMenu(self, event):
# Haupt Layout Windows Erzeugen.
#print self.parent
self.mainLayoutWindow = LayoutWindow(self, wx.LAYOUT_VERTICAL, 220, wx.SIMPLE_BORDER)
self.mainLayoutWindow_secLeft = LayoutWindow(self.mainLayoutWindow.leftWindow,
wx.LAYOUT_HORIZONTAL, 30, wx.SUNKEN_BORDER)
event.Skip()
def OnCloseItem_fileMenu(self, event):
event.Skip()
#
# helpMenu
#
def OnHelpItem_helpMenu(self, event):
event.Skip()
class App(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
self.main = create(None, True)
self.main.Show()
self.SetTopWindow(self.main)
return True
def main():
application = App(0)
application.MainLoop()
if __name__ == '__main__':
main()
Sorry falls die Erklärung jetzt zu Lange ausfällt, aber ich will bis her den Stand der dinge genau schildern damit ihr nicht lange suche müsst und mich nicht auf dinge hinweißt müsst die ich bereits entdeckt habe
Ok dan fange ich mal an:
So bei Zeile 166 ist ja die __init_-Methode von MainFrame.
Wenn man jetzt Zeilen 182, 183 und 184 auskommentiert und das Programm startet, werden die Frames von vom Type wx.SashLayoutWindow korrekt aufgebaut und angezeigt.
Das sieht da so aus:
Nun wider die Zeilen 182, 183 und 184 mit einen # kommentieren (ganz Wichtig!!)
Danach das Programm wider starten und dann auf Datei/Neue Datei klicken:
Danach sieht das so aus:
Wie man im roten kreis erkennen kann wurde das nicht richtig aufgebaut. So wenn man jetzt ABER das Fenster Maximiert oder per hand die Fenster Größe verstellt, sieht es aber aus wie im ersten Bild. Es wird dann also ein entsprechendes Event gesendet vom Type wx.EVT_SASH_DRAGGED_RANGE das die Methode in Zeile 70 aufruft. Da die Methode in Zeile 70 ein rezize macht ( Zeile 76 bzw. 78 ) wird dann ein Event vom Type wx.EVT_SIZE gesendet (logisch ^^) was dann die Methode in Zeile 87 aufruft. Die Methode in Zeile 87 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!
Wie bereits in den obigen posts erwähnt wird die Methode in Zeil 87 auch aufgeruffen wenn ich LayoutWindow in Zeile 182 Instanziere. Es muss wohl so sein das in der _init_-methode von MainFRame dan wohl auch ein Event vom Type wx.EVT_SIZE gesendent wird (?)
Die bleibt aber aus wenn ich das ganze halt in Zeile 194 mache
So nun seit ihr Profies dran. Woran könnte das liegen? Habe ich doch vielleicht ein Bug in der Klasse LayoutWindow?
Liebe Grüße und schon mal danke im voraus
xtranine
edit: "Die Methode in Zeile 78 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!" in
"Die Methode in Zeile 87 ist der Wichtigste teil. Nur dadurch findet ein refresh statt!!" geändert.
Hatte mich verschrieben
