Sto riscontrando un problema con wxPython. Una versione semplificata del codice è pubblicata di seguito (spazio bianco, commenti, ecc. Rimossi per ridurre le dimensioni - ma il formato generale del mio programma è approssimativamente lo stesso). Quando eseguo lo script, il testo statico si adatta correttamente come dovrebbe, ma gli altri elementi nel pannello non si spostano verso il basso (si comportano come se il testo statico fosse solo una riga e quindi non tutto fosse visibile). Se ridimensiono manualmente la finestra/frame, anche solo una piccola quantità, tutto viene corretto e visualizzato come dovrebbe. Ho scattato schermate per mostrare questo comportamento, ma ho appena creato questo account e quindi non ho i 10 punti reputazione necessari per poter pubblicare le foto.Problemi wxPython con Wrapping StaticText
Perché non viene visualizzato correttamente per iniziare? Ho provato tutti i tipi di combinazioni di GetParent(). Refresh() o Update() e GetTopLevelParent(). Update() o Refresh(). Ho provato tutto quello che posso pensare, ma non riesco a farlo visualizzare correttamente senza ridimensionare manualmente la cornice/finestra. Una volta ridimensionato, funziona esattamente come lo voglio io.
Informazioni:
Windows XP
Python 2.5.2
wxPython 2.8.11.0 (RSU-unicode)
Qualche suggerimento? Grazie!
Codice:
#! /usr/bin/python
import wx
class StaticWrapText(wx.PyControl):
def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER,
validator=wx.DefaultValidator, name='StaticWrapText'):
wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name)
self.statictext = wx.StaticText(self, wx.ID_ANY, label, style=style)
self.wraplabel = label
#self.wrap()
def wrap(self):
self.Freeze()
self.statictext.SetLabel(self.wraplabel)
self.statictext.Wrap(self.GetSize().width)
self.Thaw()
def DoGetBestSize(self):
self.wrap()
#print self.statictext.GetSize()
self.SetSize(self.statictext.GetSize())
return self.GetSize()
class TestPanel(wx.Panel):
def __init__(self, *args, **kwargs):
# Init the base class
wx.Panel.__init__(self, *args, **kwargs)
self.createControls()
def createControls(self):
# --- Panel2 -------------------------------------------------------------
self.Panel2 = wx.Panel(self, -1)
msg1 = 'Below is a List of Files to be Processed'
staticBox = wx.StaticBox(self.Panel2, label=msg1)
Panel2_box1_v1 = wx.StaticBoxSizer(staticBox, wx.VERTICAL)
Panel2_box2_h1 = wx.BoxSizer(wx.HORIZONTAL)
Panel2_box3_v1 = wx.BoxSizer(wx.VERTICAL)
self.wxL_Inputs = wx.ListBox(self.Panel2, wx.ID_ANY, style=wx.LB_EXTENDED)
sz = dict(size=(120,-1))
wxB_AddFile = wx.Button(self.Panel2, label='Add File', **sz)
wxB_DeleteFile = wx.Button(self.Panel2, label='Delete Selected', **sz)
wxB_ClearFiles = wx.Button(self.Panel2, label='Clear All', **sz)
Panel2_box3_v1.Add(wxB_AddFile, 0, wx.TOP, 0)
Panel2_box3_v1.Add(wxB_DeleteFile, 0, wx.TOP, 0)
Panel2_box3_v1.Add(wxB_ClearFiles, 0, wx.TOP, 0)
Panel2_box2_h1.Add(self.wxL_Inputs, 1, wx.ALL|wx.EXPAND, 2)
Panel2_box2_h1.Add(Panel2_box3_v1, 0, wx.ALL|wx.EXPAND, 2)
msg = 'This is a long line of text used to test the autowrapping '
msg += 'static text message. '
msg += 'This is a long line of text used to test the autowrapping '
msg += 'static text message. '
msg += 'This is a long line of text used to test the autowrapping '
msg += 'static text message. '
msg += 'This is a long line of text used to test the autowrapping '
msg += 'static text message. '
staticMsg = StaticWrapText(self.Panel2, label=msg)
Panel2_box1_v1.Add(staticMsg, 0, wx.ALL|wx.EXPAND, 2)
Panel2_box1_v1.Add(Panel2_box2_h1, 1, wx.ALL|wx.EXPAND, 0)
self.Panel2.SetSizer(Panel2_box1_v1)
# --- Combine Everything -------------------------------------------------
final_vbox = wx.BoxSizer(wx.VERTICAL)
final_vbox.Add(self.Panel2, 1, wx.ALL|wx.EXPAND, 2)
self.SetSizerAndFit(final_vbox)
class TestFrame(wx.Frame):
def __init__(self, *args, **kwargs):
# Init the base class
wx.Frame.__init__(self, *args, **kwargs)
panel = TestPanel(self)
self.SetClientSize(wx.Size(500,500))
self.Center()
class wxFileCleanupApp(wx.App):
def __init__(self, *args, **kwargs):
# Init the base class
wx.App.__init__(self, *args, **kwargs)
def OnInit(self):
# Create the frame, center it, and show it
frame = TestFrame(None, title='Test Frame')
frame.Show()
return True
if __name__ == '__main__':
app = wxFileCleanupApp()
app.MainLoop()
EDIT:
Vedi il mio post qui sotto per una soluzione che funziona!
Avrei dovuto pensarci. Di solito vuoi chiamare Layout sul genitore dei widget o sul sizer che contiene i widget. Oh bene. Mi spiace di non averlo notato. –
Grazie per l'aiuto! Ancora non funziona come dovrebbe quando massimizzo/minimizzo la finestra. Ma per il momento, è abbastanza buono. –
Ah, questo funziona anche quando si utilizza il pulsante di ingrandimento ... nella funzione wrap, utilizzare self.statictext.Wrap (self.GetParent(). GetSize(). Width) anziché self.statictext.Wrap (self .GetSize(). Width) –