wxPython:如何让TextCtrl不填充整个面板?

时间:2012-08-21 19:22:30

标签: wxpython panel 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()

2 个答案:

答案 0 :(得分:2)

您的问题是wx.TextCtrl未在面板中居中。这是因为您将位置设置为(1,1)(即左上角和右下角1个像素)

我运行了您的代码(注释掉与wx.BitmapButton相关的代码,因为我没有该文件)。如果将面板差异从4像素增加到10像素,您会看到:

10 pixel border, not centered

注意右下角的所有颜色是怎样的?

迈克德里斯科尔已经给你答案,但你有点误解。使用wx.All标志和sizer的重点不是要创建一个可以设置颜色的边框,而是将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 pixel border, centered

作为旁注,正如我在代码中提到的那样,设置面板大小 - 4只相当于一个2像素的边框,这很难看到。这可能也是你问题的一部分。

答案 1 :(得分:1)

如果您不希望文本控件展开,则在将其添加到sizer时,请勿将其比例设置为1(一)。您甚至可以添加一个wx.ALL标志,并在其周围放置几个像素的边框。您还可以查看小部件检查工具,了解它如何突出显示大小调整器。然后您可以使用sizer作为边框:http://wiki.wxpython.org/Widget%20Inspection%20Tool

或者看看Robin Dunn在这篇帖子中关于绘制自定义边框的答案:

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