Не могу добавить текстовый элемент управления, не блокируя панель инструментов в 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 ответа

Решение

Ну, есть пара вопросов

  1. Вы не добавили TextCtrl к BoxSizer так что не выложу
  2. Вы не установили размер для 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,

Другие вопросы по тегам