Используя код Майка Дрисколла в качестве основы, я надеюсь, что это демонстрирует мою проблему.Есть две разные версии использования "TXT".Вот три вещи, которые я хочу, чтобы вы попробовали:
Запустите его как есть.С моим StaticWrapText.Сначала он отображается неправильно, но изменил размер окна, и он работает именно так, как я хочу.До «кнопки» нет пустого / пустого места под текстом
Измените эти две строки (измените комментарии):
txt = wx.StaticText (panel, label =)текст)
#txt = StaticWrapText (панель, метка = текст)
Теперь вы увидите, что переноса нет, а текст всегда находится в одной строке.Определенно не то, что мы хотим.Это из-за "sizer.Add (txt, 0, wx.EXPAND, 5)" ... так что переходите к части 3 ...
Сохраните изменения из части 2а также изменить:
sizer.Add (txt, 0, wx.EXPAND, 5)
на:
sizer.Add (txt, 1, wx.EXPAND, 5)
Так что теперь статический текстбудет расширяться.Это близко к работе ... НО я не хочу, чтобы все это впустую пространство между текстом и кнопкой.Если вы сделаете окно большим, будет много потерянного пространства.См. Часть 1 после изменения размера окна, чтобы увидеть разницу.
Код:
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 MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
text = "I'm subclasses the statictext because I want it to act exactly like a static text, but correctly wordwrap as needed. I've found several examples of it on the web, but none that worked how I wanted. The wordwrap makes it look much nicer when the user may decide to re-size the window, so I would definitely like to have it be wordwrapped. I know about the wx.lib.wordwrap, but chose to use the built in Wrap function of the statictext control instead. It basically does the same thing from what I understand."
#txt = wx.StaticText(panel, label=text)
txt = StaticWrapText(panel, label=text)
wxbutton = wx.Button(panel, label='Button', size=wx.Size(120,50))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(txt, 0, wx.EXPAND, 5)
sizer.Add(wxbutton, 1, wx.EXPAND, 5)
panel.SetSizer(sizer)
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm().Show()
app.MainLoop()
РЕДАКТИРОВАТЬ:
AHHH ... наконец-то!Я пытался использовать метод Layout () практически на каждом уровне программы, но мне действительно нужно было использовать Layout () в SIZER, который можно найти с помощью метода GetSizer (), или вы можете отправить SendSizeEvent () на панель (прокомментировано).в коде ниже).Таким образом, следующее теперь делает именно то, что я хочу!Спасибо за помощь.Единственным другим изменением было сохранение панели с self.panel в классе frame.Как примечание, я должен был поместить это утверждение ПОСЛЕ рамки. Покажите (), или оно не работало правильно.
Код:
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 MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")
# Add a panel so it looks the correct on all platforms
self.panel = wx.Panel(self, wx.ID_ANY)
text = "I'm subclasses the statictext because I want it to act exactly like a static text, but correctly wordwrap as needed. I've found several examples of it on the web, but none that worked how I wanted. The wordwrap makes it look much nicer when the user may decide to re-size the window, so I would definitely like to have it be wordwrapped. I know about the wx.lib.wordwrap, but chose to use the built in Wrap function of the statictext control instead. It basically does the same thing from what I understand."
txt = StaticWrapText(self.panel, label=text)
wxbutton = wx.Button(self.panel, label='Button', size=wx.Size(120,50))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(txt, 0, wx.EXPAND, 5)
sizer.Add(wxbutton, 1, wx.EXPAND, 5)
self.panel.SetSizer(sizer)
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm()
frame.Show()
#frame.panel.SendSizeEvent()
frame.panel.GetSizer().Layout()
app.MainLoop()
Как заключительная заметка, в моем оригиналеПосле публикации программы следующую строку необходимо добавить непосредственно перед или после frame.Show ():
frame.panel.Panel2.GetSizer (). Layout ()
Интересно ... с этим оригинальным примеромэто может быть до или после frame.Show (), но другой пример требует, чтобы это было после frame.Show ().Я не уверен, почему, но просто поставьте его, и вы в безопасности.