Seite 1 von 1

wx.aui AUI_MDI und AUI_DockingWindowMgr integrieren?

Verfasst: Mittwoch 28. Februar 2007, 17:18
von Hand
gibt es zu AUI irgendeine Doku, zu AUI_MDI finde ich nirgends was, nur
das Beispiel von wxPython verwendet es.

Ich möchte gerne links und unten in einem Frame Panels mit dem Dockingmanager plazieren und in der mitte MDI Panes mit verschiedenen Inhalten darstellen.

Leider funktioniert der Docking Manager in dem AUI_MDI frame nicht

Hat sowas schonmal jemand versucht?

Hier mein Testcode:

Code: Alles auswählen

import wx
import wx.aui

class MyFrame(wx.Frame):

    def __init__(self, parent, id=-1, title='wx.aui Test',
                 size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, (0,0), size, style)

        self._mgr = wx.aui.AuiManager(self)

        # create several text controls
        text1 = wx.TextCtrl(self, -1, 'Pane 1 - sample text',
                            wx.DefaultPosition, wx.Size(200,150),
                            wx.NO_BORDER | wx.TE_MULTILINE)

        text2 = wx.TextCtrl(self, -1, 'Pane 2 - sample text',
                            wx.DefaultPosition, wx.Size(200,150),
                            wx.NO_BORDER | wx.TE_MULTILINE)

        text3 = wx.TextCtrl(self, -1, 'Main content window',
                            wx.DefaultPosition, wx.Size(200,150),
                            wx.NO_BORDER | wx.TE_MULTILINE)

        text4 = wx.TextCtrl(self, -1, 'Main content window',
                            wx.DefaultPosition, wx.Size(200,150),
                            wx.NO_BORDER | wx.TE_MULTILINE)

        # add the panes to the manager
        self._mgr.AddPane(text1, wx.LEFT, 'Pane Number One')
        self._mgr.AddPane(text2, wx.BOTTOM, 'Pane Number Two')
        self._mgr.AddPane(text4, wx.CENTER)
        self._mgr.AddPane(text3, wx.TOP)

        # tell the manager to 'commit' all the changes just made
        self._mgr.Update()

        self.Bind(wx.EVT_CLOSE, self.OnClose)


    def OnClose(self, event):
        # deinitialize the frame manager
        self._mgr.UnInit()
        # delete the frame
        self.Destroy()


app = wx.App(0)
frame = MyFrame(None)
frame.Show()
app.MainLoop()

Verfasst: Mittwoch 28. Februar 2007, 21:48
von sape
Falls ich dich richtig verstehe:
1. Instanz von ``wx.aui.AuiManager`` erzeugen.
2. Ein Widget vom Typ ``wx.Panel`` schreiben das eine Instanz von AUI_MDI hat.
3. Instanz vom geschriebenen Widget zu Instanz vom ``wx.aui.AuiManager`` mit ``AddPane`` hinzufüge.

P.S.: Ungetestet.

BTW: Die Tabs (Instanz von ``wx.aui.AuiMDIChildFrame``) in einer Instanz von ``wx.aui.AuiMDIParentFrame`` lassen sich nicht entdocken, sondern nur im Frame anordnen. Siehe in Demo: *Frames und Dialogs -> AUI_MDI*

EDIT: Bitte entferne den **langen** Quelltext. Es ist dadurch nicht möglich eine neune Antwort zu geben, sondern nur Beiträge zu editieren -> Thread Blockiert!

Die Lösung für dein Problem heißt ``wx.aui.AuiNotebook`` das ein Art "Panel" und kein Frame ist.

Hier ein zusammengehacktes Beispiel, das ein Panel mit Tabs und ein TextCtrl hinzufügt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import wx.aui
wx.SetDefaultPyEncoding("utf-8")


class MainFrame(wx.Frame):
    def __init__(self, parent=None, id=-1, title="Test", 
                 pos=wx.DefaultPosition, size=(800, 600), 
                 style=wx.DEFAULT_FRAME_STYLE | wx.SUNKEN_BORDER |
                       wx.CLIP_CHILDREN):
        wx.Frame.__init__(self, parent, id, title, pos, size, style)
         
        self.wxauimgr = wxauimgr = wx.aui.AuiManager()
        wxauimgr.SetManagedWindow(self)
        
        self.nb = wx.aui.AuiNotebook(self)
        page = wx.TextCtrl(self.nb, -1, "AuiNotebook", style=wx.TE_MULTILINE)
        self.nb.AddPage(page, "Welcome")

        for num in range(1, 5):
            page = wx.TextCtrl(self.nb, -1, "This is page %d" % num ,
                               style=wx.TE_MULTILINE)
            self.nb.AddPage(page, "Tab Number %d" % num)
                
        wxauimgr.AddPane(
            wx.TextCtrl(self, -1, "Hello World!", style=wx.TE_MULTILINE),
            wx.aui.AuiPaneInfo().
                BestSize(wx.Size(250,100)).
                MinSize(wx.Size(250,100)).
                Name("wx.TextCtrl").
                Caption("TextCtrl").
                Left().CloseButton(False).MaximizeButton(True)
        )
        
        wxauimgr.AddPane(
            self.nb,
            wx.aui.AuiPaneInfo().
                BestSize(wx.Size(250,100)).
                MinSize(wx.Size(250,100)).
                Name("wx.aui.AuiNotebook").
                Caption("AuiNotebook").
                Centre()
                # Centre() durch darunterliegende Zeile ersetzten, falls es dockbar sein soll.
                #.Left().CloseButton(False).MaximizeButton(True)
        )
        wxauimgr.Update()
        
        acell_id1 = wx.NewId()
        accel = wx.AcceleratorTable([
            # Applikation beenden
            (wx.ACCEL_CTRL, wx.WXK_F4, acell_id1),
            (wx.ACCEL_CTRL, ord('Q'), acell_id1)
        ])
        self.SetAcceleratorTable(accel)
        self.Bind(wx.EVT_MENU, self.OnClose, id=acell_id1)
    
    def OnClose(self, event): 
        self.wxauimgr.UnInit()
        self.Destroy()
        event.Skip()  

def main():
    app = wx.PySimpleApp()
    mf = MainFrame()
    mf.Show()
    app.MainLoop()

Verfasst: Mittwoch 28. Februar 2007, 22:49
von Hand
Ich will meine TestApplikation um mit MDI erweitern wie dieses Beispiel:

Bild

MDI braucht aber ein mdiparent frame, und den dockingmanager krieg ich damit einfach nicht zum laufen :cry:

Ich hab den C++ Beispielcode damit bin ich aber nicht so fit
///////////////////////////////////////////////////////////////////////////////
// Name: auidemo.cpp
// Purpose: wxaui: wx advanced user interface - sample/test program
// Author: Benjamin I. Williams
// Modified by:
// Created: 2005-10-03
// RCS-ID: $Id: auidemo.cpp,v 1.44 2006/11/21 15:20:15 BIW Exp $
// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved.
// Licence: wxWindows Library Licence, Version 3.1
///////////////////////////////////////////////////////////////////////////////
Edit: Source gekürtzt, Beispiel ist bei wx-devcpp dabei