Ich habe ein Problem mit WxPython. Eine vereinfachte Version des Codes ist unten veröffentlicht (Leerraum, Kommentare, etc. entfernt, um die Größe zu reduzieren - aber das allgemeine Format zu meinem Programm wird ungefähr gleich gehalten). Wenn ich das Skript ausführe, wird der statische Text korrekt umgebrochen, aber die anderen Elemente im Panel werden nicht nach unten bewegt (sie verhalten sich so, als ob der statische Text nur eine Zeile wäre und somit nicht alles sichtbar wäre). Wenn ich das Fenster/den Rahmen manuell verkleinere, wird auch nur eine winzige Menge korrigiert und alles so angezeigt, wie es sein sollte. Ich habe Screenshots gemacht, um dieses Verhalten zu zeigen, aber ich habe gerade dieses Konto erstellt und habe daher nicht die erforderlichen 10 Rufpunkte, um Bilder posten zu dürfen.wxPython Probleme mit Wrapping StaticText
Warum wird es nicht richtig angezeigt, um damit zu beginnen? Ich habe alle möglichen Kombinationen von GetParent(), Refresh() oder Update() und GetTopLevelParent(), Update() oder Refresh() ausprobiert. Ich habe alles versucht, was mir einfällt, aber ich bekomme es nicht richtig angezeigt, ohne den Rahmen/das Fenster manuell zu verändern. Nach der Größenanpassung funktioniert es genau so, wie ich es möchte.
Informationen:
Windows XP
Python 2.5.2
WxPython 2.8.11.0 (msw-Unicode)
Irgendwelche Vorschläge? Vielen Dank!
Code:
#! /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:
Siehe meinen Beitrag unten für eine Lösung, die funktioniert!
Ich hätte daran gedacht. Normalerweise möchten Sie Layout entweder auf dem übergeordneten Element der Widgets oder auf dem Sizer, der die Widgets enthält, aufrufen. Naja. Tut mir leid, das habe ich nicht bemerkt. –
Danke für die Hilfe! Es funktioniert immer noch nicht so wie es sollte, wenn ich das Fenster maximiere/minimiere. Aber im Moment ist es gut genug. –
Ah, das macht es funktioniert, auch wenn die Maximieren-Schaltfläche verwendet wird ... in der Umbruch-Funktion verwenden Sie self.statictext.Wrap (self.GetParent(). GetSize(). Width) anstelle von self.statictext.Wrap (self.statictext.Wrap) .GetSize(). Width) –