wxPython - Ein Fenster in einem Rahmen bewegen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Peter-Gregor
User
Beiträge: 3
Registriert: Mittwoch 28. Januar 2015, 11:06
Wohnort: Taunus

Hallo zusammen,

ich stehe am Anfang der Python- und insbesondere der wxPython-Entwicklung.

Ich möchte mehrere Fenster in einem anderen Fenster haben und dort verwalten. Also dachte ich mir, ich erzeuge ein Rahmenfenster und darin mehrere Fenster. Diese Fenster möchte ich bei einer Größenänderung des Rahmens an seine Größe anpassen. Also habe ich für das Event EVT_SIZE einen Handler definiert und versuche darin die Größe und Position eines Rahmenelementes vom Typ Panel zu ändern.

Egal was ich mache es tut sich nichts, aber auch gar nichts (...außer jeder Menge Frust bei mir...) ...
Wahrscheinlich habe ich ganz grundlegende Dinge außer Acht gelassen, von denen ich nicht weiß, daß es sie gibt (wie gesagt, Anfänger).

Kann jemand helfen?

Code: Alles auswählen

from wx import * 
from wx._core import Panel


class myFrame(Frame):
    def __init__(self, parent, id, title, hsize, vsize, style, pos=(0,0)):
        Frame.__init__(self, parent, id, size=(hsize,vsize), title=title, style=style, pos=pos)

        self.hsize = hsize
        self.vsize = vsize

       # self.leftPanel = Panel(self,pos=(0,0), size=(100,400), style=DOUBLE_BORDER)
       # self.midPanel = Panel(self,pos=(100,0), size=(200,400), style=DOUBLE_BORDER)
        self.righttPanel = Panel(self,pos=(300,0), size=(100,400), style=DOUBLE_BORDER)
        self.Bind(EVT_SIZE, self.OnFrameSize)

        self.Show()

    def OnFrameSize(self, event):
        self.hsize = event.GetSize()[0]
        self.vsize = event.GetSize()[1]
        #SetSize(self.rightPanel,50,200,180,30)
        Move(self.rightPanel, (self.FrameHsize/4*3,0))

app = App()

mainFrame= myFrame(parent=None, id=1, title="Editor", hsize=400, vsize=800, style=DEFAULT_FRAME_STYLE)
mainFrame.Show()

app.MainLoop()
BlackJack

@Peter-Gregor: Sternchen-Importe sollte man vermeiden. Gerade bei `wx` ist das doch schon ein schön kurzer Name. Wegen dem Sternchen-Import musste ich jetzt extra im Modul nachschauen ob es dort auch tatsächlich keine `Move`-Funktion gibt. Gibt es nicht. Wo soll die denn herkommen? Das es sie nicht gibt hätte man sehen müssen wenn man das Programm von einer Konsole aufruft.

Namen mit führenden Unterstrichen bedeuten das man die nicht verwenden soll weil es Implementierungsdetails sind. Warum nimmst Du nicht einfach die offizielle Variante `wx.Panel`?

Das Problem würde man übrigens eher mit „Sizern“ lösen statt sich das selber zu programmieren.
BlackJack

@Peter-Gregor: Die Grösse des Frames an Attribute zu binden ist redundant weil man den Frame nach seiner Grösse fragen kann (`GetSize()`).

Ein Aufruf von `self.Show()` sollte nicht in der `__init__()` stehen. Damit nimmt man dem Aufrufer die Kontrolle über diese Operation. Das macht auch kein Widget das von `wx` angeboten wird von sich aus.

Der Stil `wx.DOUBLE_BORDER` ist nicht auf allen Plattformen verfügbar. Bei mir unter Linux wird da einfach nichts angezeigt.

Hier mal ein Beispiel mit Sizer das drei Panels nebeneinander anordnet wobei das erste und letzte Panel immer gleich breit sind und das mittlere doppelt so breit wie eines der äusseren:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
import wx
 
 
class MainFrame(wx.Frame):

    def __init__(self, parent, id, title, size=wx.DefaultSize):
        wx.Frame.__init__(self, parent, id, title, size=size)
 
        sizer = wx.BoxSizer(wx.HORIZONTAL)

        left_panel = wx.Panel(self, style=wx.BORDER_RAISED)
        left_panel.SetOwnBackgroundColour(wx.RED)
        sizer.Add(left_panel, 1, wx.EXPAND)

        mid_panel = wx.Panel(self, style=wx.BORDER_SUNKEN)
        mid_panel.SetOwnBackgroundColour(wx.GREEN)
        sizer.Add(mid_panel, 2, wx.EXPAND)

        right_panel = wx.Panel(self, style=wx.BORDER_RAISED)
        right_panel.SetOwnBackgroundColour(wx.BLUE)
        sizer.Add(right_panel, 1, wx.EXPAND)

        self.SetSizer(sizer)
        self.Fit()


def main():
    app = wx.App()
     
    main_frame = MainFrame(parent=None, id=wx.ID_ANY, title='Editor')
    main_frame.Show()
     
    app.MainLoop()


if __name__ == '__main__':
    main()
Das es das `pos`-Argument gibt, solltest Du am besten vergessen.
Antworten