wx python布局重叠字段

时间:2015-07-07 20:13:31

标签: python user-interface wxpython wxwidgets

我面临一个python跨平台应用程序的小问题。最初代码来自GUI wx代码生成器,不幸的是我丢失了这部分。所以我尝试使用wx python代码直接使用记事本。

当ListCtrl的垂直大小超过170像素时,这会透过" OK"按钮如下。我无法看到如何向下移动OK按钮并增加结果列表的垂直大小。我对wx并不放心,而且我真的坚持这一点。

这是我的代码

frame.py(垂直尺寸= 190)

import wx
import wx.xrc

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u'WINDOW', pos=wx.DefaultPosition, size=wx.Size(494, 439), style=wx.CAPTION | wx.CLOSE_BOX | wx.SYSTEM_MENU)
        self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
        self.SetBackgroundColour(wx.Colour(234, 237, 240))
        bSizer1 = wx.BoxSizer(wx.VERTICAL)
        bSizer6 = wx.BoxSizer(wx.VERTICAL)
        bSizer6.AddSpacer((0, 30), 0, wx.EXPAND, 5)
        bSizer7 = wx.BoxSizer(wx.HORIZONTAL)
        bSizer7.SetMinSize(wx.Size(240, -1))
        bSizer7.AddSpacer((65, 0), 0, 0, 5)
        self.m_bitmap2 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u'icons.png', wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.DefaultSize, wx.RAISED_BORDER)
        self.m_bitmap2.SetToolTipString(u'OPEN')
        bSizer7.Add(self.m_bitmap2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
        bSizer7.AddSpacer((55, 0), 1, wx.EXPAND, 5)
        self.m_staticText1 = wx.StaticText(self, wx.ID_ANY, u'Search', wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText1.Wrap(-1)
        self.m_staticText1.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))
        bSizer7.Add(self.m_staticText1, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        self.searchfield = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_PROCESS_ENTER)
        self.searchfield.SetMaxLength(0)
        self.searchfield.SetFont(wx.Font(15, 70, 90, 90, False, wx.EmptyString))
        bSizer7.Add(self.searchfield, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        bSizer6.Add(bSizer7, 1, 0, 5)
        bSizer6.AddSpacer((0, 15), 0, 0, 5)
        self.gosearch = wx.Button(self, wx.ID_ANY, u'List', wx.DefaultPosition, wx.DefaultSize, 0)
        self.gosearch.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString))
        bSizer6.Add(self.gosearch, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 5)
        bSizer6.AddSpacer((0, 10), 0, 0, 5)
        bSizer1.Add(bSizer6, 1, wx.EXPAND, 5)
        gSizer3 = wx.GridSizer(4, 0, 0, 0)
        self.dataout = wx.ListCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(480, 190), wx.LC_REPORT | wx.LC_SINGLE_SEL)
        self.dataout.SetFont(wx.Font(10, 70, 90, 90, False, wx.EmptyString))
        gSizer3.Add(self.dataout, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
        gSizer3.AddSpacer((0, 0), 1, wx.EXPAND, 5)
        self.butok = wx.Button(self, wx.ID_ANY, u'OK', wx.DefaultPosition, wx.DefaultSize, 0)
        self.butok.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))
        gSizer3.Add(self.butok, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_BOTTOM, 5)
        self.m_staticText7 = wx.StaticText(self, wx.ID_ANY, u'help', wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText7.Wrap(-1)
        self.m_staticText7.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, True, wx.EmptyString))
        gSizer3.Add(self.m_staticText7, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_BOTTOM | wx.ALL, 5)
        bSizer1.Add(gSizer3, 1, wx.EXPAND, 5)
        self.SetSizer(bSizer1)
        self.Layout()
        self.Centre(wx.BOTH)

main.py

import sys
import wx
import frame

if __name__ == '__main__':
    app = wx.App(True)
    frame1 = frame.MyFrame(None)
    frame1.Show(True)
    app.SetTopWindow(frame1)
    app.MainLoop()
    sys.exit()

enter image description here

感谢您的有用答案。

3 个答案:

答案 0 :(得分:1)

我喜欢使用从2.8.12开始提供的大小控件(我相信),它们提供的sizer几乎是免费的,编码更少,特别是如果您手动编码。如果你使用关键字(我改变了一些代码,显示我的意思),我也认为代码更清晰/可理解,这允许你放弃使用控件默认值的地方。

使用有意义的变量名称也会更好,例如代替 self.m_statictext7 使用 self.stHelp 之类的内容。

# -*- coding: utf-8 -*-

import wx
import wx.lib.sized_controls as sc


class MyFrame(sc.SizedFrame):
    def __init__(self, parent):
        super(MyFrame, self).__init__(parent,
                                      title=u'WINDOW',
                                      style=wx.CAPTION | wx.CLOSE_BOX | wx.SYSTEM_MENU)
        self.SetBackgroundColour(wx.Colour(234, 237, 240))

        pane = self.GetContentsPane()

        paneSearch = sc.SizedPanel(pane)
        paneSearch.SetSizerType("horizontal")
        paneSearch.SetSizerProps(align="center")
        self.m_bitmap2 = wx.StaticBitmap(paneSearch,
                                         bitmap=wx.Bitmap(u'icons.png', wx.BITMAP_TYPE_ANY),
                                         style=wx.RAISED_BORDER)
        self.m_bitmap2.SetToolTipString(u'OPEN')

        self.stSearch = wx.StaticText(paneSearch,
                                      label=u'Search')
        self.stSearch.Wrap(-1)
        self.stSearch.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))

        self.searchfield = wx.TextCtrl(paneSearch,
                                       style=wx.TE_PROCESS_ENTER)
        self.searchfield.SetMaxLength(0)
        self.searchfield.SetFont(wx.Font(15, 70, 90, 90, False, wx.EmptyString))

        self.gosearch = wx.Button(pane, label=u'List')
        self.gosearch.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString))
        self.gosearch.SetSizerProps(align="center")

        self.dataout = wx.ListCtrl(pane, size=wx.Size(480, 190),
                                   style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
        self.dataout.SetFont(wx.Font(10, 70, 90, 90, False, wx.EmptyString))

        self.butok = wx.Button(pane, label=u'OK')
        self.butok.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))
        self.butok.SetSizerProps(align="center")

        self.stHelp = wx.StaticText(pane, label=u'help')
        self.stHelp.Wrap(-1)
        self.stHelp.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, True, wx.EmptyString))
        self.stHelp.SetSizerProps(align="center")

        self.Fit()


if __name__ == '__main__':
    app = wx.App(True)
    frame1 = MyFrame(None)
    frame1.Show(True)
    app.SetTopWindow(frame1)
    app.MainLoop()

答案 1 :(得分:0)

感谢您的时间。在你的建议的启发下,我写道:

...
FavBtn = sc.SizedPanel(pane)
FavBtn.SetSizerType("vertical")
FavBtn.SetSizerProps(align="center", proportion=2)
self.m_bitmap2 = wx.StaticBitmap(FavBtn,
                                     bitmap=wx.Bitmap(u'icons.png', wx.BITMAP_TYPE_ANY),
                                     style=wx.RAISED_BORDER)
self.m_bitmap2.SetToolTipString(u'OPEN')
paneSearch = sc.SizedPanel(pane)
paneSearch.SetSizerType("horizontal")
paneSearch.SetSizerProps(align="center")
self.stSearch = wx.StaticText(paneSearch,
                                  label=u'Search')
self.stSearch.Wrap(-1)
self.stSearch.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))

self.searchfield = wx.TextCtrl(paneSearch,
                                   style=wx.TE_PROCESS_ENTER)
self.searchfield.SetMaxLength(0)
self.searchfield.SetFont(wx.Font(15, 70, 90, 90, False, wx.EmptyString))

self.gosearch = wx.Button(pane, label=u'List')
self.gosearch.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString))
self.gosearch.SetSizerProps(align="center")
...

但是我需要在顶部的“fav”按钮和列表搜索之间分隔并添加一个空格。我怎样才能做到这一点?同样,如果我可以在窗口顶部和fav按钮之间添加空格,那会更好。 我无法用lib大小做到这一点,似乎太自动了。

答案 2 :(得分:0)

这可能看起来很脏,但添加了一个" null"在fav按钮之前和之后的位图图像就是这样做的。

self.m_bitmap_space = wx.StaticBitmap(FavBtn, bitmap=wx.NullBitmap)
self.m_bitmap2 = wx.StaticBitmap(FavBtn,
                                     bitmap=wx.Bitmap(u'icons.png', wx.BITMAP_TYPE_ANY),
                                     style=wx.RAISED_BORDER)
self.m_bitmap2.SetToolTipString(u'OPEN')
self.m_bitmap_space2 = wx.StaticBitmap(FavBtn, bitmap=wx.NullBitmap)

也许你有类似这样的伎俩,例如间距设置。