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)

Което води до прозорец като този: 10 пиксела рамка, центрирана

Като странична бележка, както споменах в моя код, настройката на размера на панела - 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

Или вижте отговора на Robin Dunn в тази нишка за изчертаване на персонализирана рамка:

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 просто поставя място около джаджата. Което мислех, че ще изглежда така, сякаш има по-голяма граница. Както и да е, можете да погледнете отговора на Акатъл, докато той обяснява за какво говоря. - person Mike Driscoll; 22.08.2012