【问题标题】:wx python layout overlap fieldswx python布局重叠字段
【发布时间】:2015-07-14 01:04:28
【问题描述】:

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

当 ListCtrl 的垂直大小超过 170 px 时,这会覆盖下面的“确定”按钮。我看不到如何向下移动 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()

感谢您提供有用的答案。

【问题讨论】:

    标签: python user-interface wxpython wxwidgets


    【解决方案1】:

    我喜欢使用从 2.8.12 开始提供的大小控件(我相信),它们几乎免费提供大小调整器,而且编码更少,特别是如果您手动编码。我还认为,如果您使用关键字,代码会更清晰/易于理解(我更改了一些代码,以说明我的意思),这样您就可以在使用控件默认值的地方放下东西。

    最好使用有意义的变量名,例如代替 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()
    

    【讨论】:

    • 感谢您的宝贵时间。
    【解决方案2】:

    感谢您的宝贵时间。受到您的建议的启发,我写道:

    ...
    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")
    ...
    

    但我需要在顶部“收藏”按钮和列表搜索之间分开并添加一个空格。我怎样才能做到这一点?同样,如果我可以在窗口顶部和收藏按钮之间添加空间,这会更好。 使用 lib-sized 时我无法成功,似乎太自动化了。

    【讨论】:

      【解决方案3】:

      这可能看起来很脏,但是在收藏按钮之前和之后添加一个“空”位图图像就可以了。

      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)
      

      也许你有类似的技巧,例如间距设置。

      【讨论】:

        猜你喜欢
        • 2020-11-22
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        相关资源
        最近更新 更多