Frage

Ich möchte in der Lage sein Notebook und ein TxtCtrl Wxwidgets in einem einzigen Frame angezeigt werden soll. Unten ist ein Beispiel aus dem wxpython Wiki angepasst; ist es möglich, ihr Layout (vielleicht mit so etwas wie wx.SplitterWindow) anzuzeigen das Textfeld unter dem Notebook im selben Rahmen?

ändern
import wx
import wx.lib.sheet as sheet

class MySheet(sheet.CSheet):
    def __init__(self, parent):
        sheet.CSheet.__init__(self, parent)

        self.SetLabelBackgroundColour('#CCFF66')
        self.SetNumberRows(50)
        self.SetNumberCols(50)


class Notebook(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(600, 600))
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(101, 'Quit', '' )
        menubar.Append(file, "&File")
        self.SetMenuBar(menubar)
        wx.EVT_MENU(self, 101, self.OnQuit)
        nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
        self.sheet1 = MySheet(nb)
        self.sheet2 = MySheet(nb)
        self.sheet3 = MySheet(nb)
        nb.AddPage(self.sheet1, "Sheet1")
        nb.AddPage(self.sheet2, "Sheet2")
        nb.AddPage(self.sheet3, "Sheet3")
        self.sheet1.SetFocus()
        self.StatusBar()

    def StatusBar(self):
        self.statusbar = self.CreateStatusBar()

    def OnQuit(self, event):
        self.Close()


class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400))
        self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        self.Center()

class MyApp(wx.App):
    def OnInit(self):
        frame = Notebook(None, -1, 'notebook.py')
        frame.Show(True)
        frame.Center()
        frame2 = MyFrame(None, -1, '')
        frame2.Show(True)
        self.SetTopWindow(frame2)
        return True


app = MyApp(0)
app.MainLoop()
War es hilfreich?

Lösung

Erstellen zwei Widgets auf dem gleichen Rahmen erscheinen ist einfach, eigentlich. Sie sollten sizers verwenden, um dies zu erreichen.

In Ihrem Beispiel können Sie Ihre Notebook Klassenimplementierung zu so etwas wie dies ändern:

class Notebook(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(600, 600))
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(101, 'Quit', '' )
        menubar.Append(file, "&File")
        self.SetMenuBar(menubar)
        wx.EVT_MENU(self, 101, self.OnQuit)
        nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
        self.sheet1 = MySheet(nb)
        self.sheet2 = MySheet(nb)
        self.sheet3 = MySheet(nb)
        nb.AddPage(self.sheet1, "Sheet1")
        nb.AddPage(self.sheet2, "Sheet2")
        nb.AddPage(self.sheet3, "Sheet3")
        self.sheet1.SetFocus()
        self.StatusBar()
        # new code begins here:
        # add your text ctrl:
        self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        # create a new sizer for both controls:
        sizer = wx.BoxSizer(wx.VERTICAL)
        # add notebook first, with size factor 2:
        sizer.Add(nb, 2)
        # then text, size factor 1, maximized
        sizer.Add(self.text, 1, wx.EXPAND)
        # assign the sizer to Frame:
        self.SetSizerAndFit(sizer)

Es wird nur die __init__ Methode geändert. Beachten Sie, dass die Proportionen zwischen dem Notebook und Textkontrolle manipulieren können durch das zweite Argument der Add Methode zu ändern.

Sie können mehr über Sizer von der offiziellen Artikel Sizer Übersicht erfahren.

Andere Tipps

Sie können einen Splitter verwenden, ja.

Auch macht es Sinn, ein Panel zu erstellen, legen Sie Ihre Widgets in es (mit Sizer), und fügen Sie diese Anzeige den Rahmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top