Domanda

Ho un wx.Frame che ha solo un singolo bambino. Durante l'impostazione wx.Sizer del bambino, posso usare il flag wx.SHAPED, che mantiene le proporzioni del bambino bloccato. Tuttavia, il telaio ha ancora una completa libertà nella sua proporzioni, e lascerà uno spazio bianco nella zona che è rimasto inutilizzato da parte del bambino.

Come posso bloccare il rapporto di aspetto del wx.Frame durante il ridimensionamento?

È stato utile?

Soluzione

Sizers non possono essere applicati a finestre di primo livello (per definire le proprietà delle finestre stesse in contrasto con il loro contenuto), quindi purtroppo non c'è modo "vero" per bloccare le proporzioni. La cosa migliore sarebbe quella di catturare evento OnSize della tua finestra, ottenere la dimensione che l'utente desidera la finestra di essere (che è memorizzato nella wxSizeEvent), calcolare la nuova larghezza e l'altezza in base al rapporto di aspetto e poi chiamare immediatamente SetSize con la nuova dimensione.

Questa tecnica ha l'inconveniente di artefatti visivi durante il ridimensionamento (il sistema operativo sarà inizialmente dipingere la finestra a seconda di come l'utente ha trascinato, ma poi subito ridisegnare dopo aver chiamato SetSize, portando ad un effetto di sfarfallio) in modo che isn' t una grande soluzione, ma dal momento che non è possibile bloccare finestre di primo livello in rapporti d'aspetto (e prevenire la necessità di ridimensionare con SetSize a tutti) si dovrà decidere se lo sfarfallio è valsa la pena.

Altri suggerimenti

Ecco alcuni esempi di codice. C'è un bel po 'di sfarfallio, e non sono sicuro di un buon modo per eliminarla.

import wx

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None, -1, 'Shaped Frame')
        self.Bind(wx.EVT_SIZE, self.on_size)
        self.panel = panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel, 1, wx.SHAPED)
        self.SetSizer(sizer)
    def on_size(self, event):
        event.Skip()
        self.Layout()
        self.panel.SetMinSize(self.panel.GetSize())
        self.Fit()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top