【问题标题】:wxPython: How to make a TextCtrl not fill the whole panel?wxPython:如何使 TextCtrl 不填满整个面板?
【发布时间】:2012-08-17 04:45:00
【问题描述】:

我有一个包含按钮的面板以及另一个本身包含 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()

【问题讨论】:

    标签: wxpython panel textctrl


    【解决方案1】:

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

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

    注意到右下角的所有颜色了吗?

    Mike Driscoll 已经给了你答案,但你有点误解了。使用wx.All 标志和sizer 的目的不是创建可以设置颜色的边框,而是将wx.TextCtrl 在面板中居中并让面板的颜色显示出来。

    看这段代码sn-p

    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 像素边框,这很难看到。这也可能是您的问题的一部分。

    【讨论】:

    • 太棒了!非常感谢你们完美地完成了这个把戏!我想我也对如何使用和使用 SetSizer 感到有些困惑。
    【解决方案2】:

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

    或者在这个线程中查看 Robin Dunn 关于绘制自定义边框的回答:

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

    【讨论】:

    • 感谢您的回答,但不幸的是,在添加到 sizer 时,我已经没有将比例设置为 1,使用 wx.ALL 不允许我自定义边框的颜色,不幸的是我可以对 Robin 的 Dunn 回答没有多大意义(我尝试像他的示例中那样创建自定义的 textctrl,但行为不会改变)。您是否有任何其他想法或具体示例来说明如何做到这一点?非常感谢您的帮助
    • wx.ALL 只是在小部件周围放置空间。我认为这会让它看起来有更大的边界。无论如何,你可以看看 acattle 的回答,因为他解释了我在说什么。
    猜你喜欢
    • 2011-03-26
    • 2012-07-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2011-04-12
    • 2013-08-25
    • 2023-03-29
    相关资源
    最近更新 更多