wxPython: Как заставить TextCtrl не заполнять всю панель?

У меня есть панель, содержащая кнопку, а также другая панель, которая сама содержит textCtrl. У меня есть панель только для textctrl, потому что я пытаюсь установить собственный цвет границы вокруг textCtrl. К сожалению, я не могу заставить textCtrl не заполнять всю панель. Я подозреваю, что это связано с SetSizerAndFit, но я не уверен. Возможно ли иметь индивидуальную цветную рамку вокруг textCtrl ? Вот код:

class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):

        wx.Frame.__init__(self,parent,wx.ID_ANY,title,size=(800,600))

    self.panel=wx.Panel(self,wx.ID_ANY,style=wx.BORDER_SIMPLE)
    self.panelText=wx.Panel(self.panel,wx.ID_ANY,
        size=(450,40),style=wx.BORDER_SIMPLE)

    self.panel.SetBackgroundColour("white")
    self.panelText.SetBackgroundColour("#27bbdc")

    size=self.panelText.GetSize()

    self.sizerControls=wx.BoxSizer(wx.HORIZONTAL)
    self.sizerMain=wx.BoxSizer(wx.VERTICAL)
    #self.sizerText=wx.BoxSizer(wx.HORIZONTAL)

    #-------------Objects------------
    self.text=wx.TextCtrl(self.panelText,-1, style=wx.TE_READONLY|wx.NO_BORDER,
        size=(size[0]-4,size[1]-4),pos=(1,1))
    image=wx.Image("Button_80x80.png",wx.BITMAP_TYPE_ANY).ConvertToBitmap()
    self.buttonFolder=wx.BitmapButton(self.panel,-1,bitmap=image,
        size=(95,95),style=wx.NO_BORDER)        

    #-------------Sizers-------------
    #self.sizerText.Add((0,0),1)
    #self.sizerText.Add(self.text,0,flag=wx.ALIGN_CENTER)
    #self.sizerText.Add((0,0),1)
    self.sizerControls.Add(self.panelText,1,flag=wx.ALIGN_CENTER)
    self.sizerControls.Add(self.buttonFolder,0,flag=wx.ALIGN_CENTER)
    self.sizerMain.Add(self.sizerControls,1,flag=wx.ALIGN_CENTER)

    #-------------Events-------------
    self.Bind(wx.EVT_BUTTON, self.OnButton, self.buttonFolder)

    self.panel.SetSizerAndFit(self.sizerMain)

    self.Show()

person Alexei Bassinski    schedule 21.08.2012    source источник


Ответы (2)


Ваша проблема в том, что wx.TextCtrl не находится в центре панели. Это потому, что вы устанавливаете позицию на (1,1) (т.е. на 1 пиксель ниже и правее верхнего левого угла)

Я запустил ваш код (закомментировал код, относящийся к wx.BitmapButton, так как у меня не было файла). Если вы увеличите разницу между панелями с 4 пикселей до 10 пикселей, вы увидите следующее:

граница 10 пикселей, не по центру

Обратите внимание, как весь цвет находится в правом нижнем углу?

Майк Дрисколл уже дал вам ответ, но вы немного не поняли. Смысл использования флага wx.All и сайзера заключался не в том, чтобы создать границу, на которой вы могли бы установить цвет, а в том, чтобы центрировать ваш wx.TextCtrl на панели и позволить цвету панели просвечиваться.

Посмотрите на этот фрагмент кода

self.sizerText=wx.BoxSizer(wx.HORIZONTAL)
self.text=wx.TextCtrl(self.panelText,-1, style=wx.TE_READONLY|wx.NO_BORDER)
#dont' set the size nor the position
self.sizerText.Add(self.text, 1, flag=wx.ALL|wx.EXPAND, border=10)
#make the textCtrl expand in all possible directions but leave a 10 pixel border on all sides
#since the border is on left/right and top/bottom this is equivalent to panel size - 20
self.panelText.SetSizer(self.sizerText)

В результате появится окно, подобное этому:

В качестве примечания, как я упоминал в своем коде, установка размера панели - 4 соответствует границе только в 2 пикселя, которую трудно увидеть. Возможно, это также было частью вашей проблемы.

person acattle    schedule 22.08.2012
comment
Потрясающий ! Большое спасибо ребятам, которые отлично справились с заданием! Я думаю, что я также был немного сбит с толку тем, как использовать и для чего использовать SetSizer. - person Alexei Bassinski; 22.08.2012

Если вы не хотите, чтобы текстовый элемент управления расширялся, не устанавливайте его пропорцию 1 (один), когда вы добавляете его в размерчик. Вы даже можете добавить флаг wx.ALL и поместить вокруг него границу в несколько пикселей. Вы также можете проверить инструмент проверки виджетов, чтобы увидеть, как он выделяет сайзеры. Затем вы можете использовать сайзер в качестве границы: http://wiki.wxpython.org/Widget%20Inspection%20Tool

Или посмотрите ответ Робина Данна в этой теме о рисовании пользовательской границы:

https://groups.google.com/forum/?fromgroups=#!topic/wxpython-users/aZUo4R2rubY

person Mike Driscoll    schedule 21.08.2012
comment
Спасибо за ответ, но, к сожалению, я уже не устанавливаю пропорцию 1 при добавлении к размерчику, использование wx.ALL не позволит мне настроить цвет моей границы, и, к сожалению, я не могу понять ответ Робина Данна. (Я пытался создать настраиваемый textctrl, как в его примере, но поведение не изменилось). У вас случайно нет других идей или конкретных примеров того, как это сделать? Большое спасибо за помощь - person Alexei Bassinski; 22.08.2012
comment
wx.ALL просто помещает пространство вокруг виджета. Что, как я думал, заставит его выглядеть так, как будто у него большая граница. В любом случае, вы можете посмотреть на ответ acattle, поскольку он объясняет, о чем я говорил. - person Mike Driscoll; 22.08.2012