Не могу добавить текстовый элемент управления, не блокируя панель инструментов в wxpython
Я воспроизвел ошибку здесь;
import wx
import debug
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
vbox = wx.BoxSizer(wx.VERTICAL)
toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
vbox.Add(toolbar, 0, border=5)
app = wx.App(0)
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
Теперь куда бы я ни добавил эту строку, чтобы добавить текстовый элемент управления;
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
он появляется над панелью инструментов. Я прочитал документацию и следовал некоторым учебникам, но все еще не могу полностью понять концепцию. Как я могу достичь того, чего хочу? Я хочу, чтобы текстовый элемент управления отображался под панелью инструментов и занимал оставшееся пространство.
2 ответа
Ну, есть пара вопросов
- Вы не добавили
TextCtrl
кBoxSizer
так что не выложу - Вы не установили размер для
Frame
Вы можете сделать что-то вроде этого...
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(toolbar, 0, border=5)
vbox.Add(self.control, 1, border=5)
self.SetSizer(vbox)
... но, вероятно, лучше использовать Frame
"s CreateToolBar()
метод, то вам не нужно беспокоиться о его макете...
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = self.CreateToolBar(style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.control, 1, border=5)
self.SetSizer(vbox)
... действительно, если TextCtrl
это единственная вещь в кадре, вам даже не нужен классификатор...
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = self.CreateToolBar(style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
Не видя фактического кода проблемы, трудно быть уверенным, но я держу пари, что вы хотите это:
vbox.Add(self.control)
Или, если TextCtrl
не строится внутри __init__
сделай это self.vbox.Add
и, конечно, изменить vbox
ссылки в __init__
в self.vbox
,
Цитирование из документов:
Основная идея, лежащая в основе сортировщика блоков, заключается в том, что окна чаще всего будут иметь довольно простую базовую геометрию, обычно в виде строки или столбца или вложенных иерархий того и другого. Wx.BoxSizer разместит свои элементы в простой строке или столбце, в зависимости от параметра ориентации, переданного конструктору.
Это именно то, что вы хотите - вы хотите поставить TextCtrl
чтобы выложить вертикально под Toolbar
, Если вы положите их обоих в одно и то же BoxSizer
это произойдет автоматически.
Но если вы положите TextCtrl
прямо в Frame
, а также положить BoxSizer
с Toolbar
внутри этого же Frame
Вы не сказали wx, как расположить элементы управления внутри Frame
,