1

我正在向水平 wx.BoxSizer 添加元素,但它们不是彼此相邻布置,而是彼此重叠显示(全部放置在父面板的像素位置 (0,0) 中)。

以下是文件的缩短版本(相关部分):

主要.py:

import wx
from frm_users import UsersForm

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "My App Title", size=(1200, 800))
        self.panel = wx.Panel(self, wx.ID_ANY)
        self.statusbar = self.CreateStatusBar(2)
        self.statusbar.SetStatusWidths([-1, 60])

    # this event is bound to a menu item I construct elsewhere
    def onUsers(self, event=None):
        frmUsers = UsersForm(self.panel)


if __name__ == "__main__":    
    app = wx.App(False)
    frame = MainFrame()    
    frame.Show()
    app.MainLoop()

frm_users.py:

from dbmodel import OlvUsers, Users
import forms_controller
import wx

class UsersForm(wx.Panel):
    def __init__(self, parent):
        # parent here is the panel

        toolbox = forms_controller.getToolboxSizer(self, parent)
        parent.SetSizer(toolbox)


    def onSearch(self, event=None):
        print("Searching")

forms_controller.py:

import wx


def getToolboxSizer(parent, frame):
    # frame is a panel usually
    toolboxSizer = wx.BoxSizer(wx.HORIZONTAL)
    toolboxSizer.AddSpacer(5)

    font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)
    # create the search related widgets
    searchByLbl = wx.StaticText(frame, label="Search By:")
    searchByLbl.SetFont(font)
    toolboxSizer.Add(searchByLbl, 0, wx.ALL, 5)

    cat = ["Author", "Title", "ISBN", "Publisher"]
    categories = wx.ComboBox(frame, value="Author", choices=cat)
    toolboxSizer.Add(categories, 0, wx.ALL, 5)

    search = wx.SearchCtrl(frame, style=wx.TE_PROCESS_ENTER)
    search.Bind(wx.EVT_TEXT_ENTER, parent.onSearch)
    toolboxSizer.Add(search, 0, wx.ALL, 5)

    return toolboxSizer

我错过了什么?

4

1 回答 1

1

main.py中, 的实例UsersForm不在 sizer 内。面板不会自动填充其父级,除非它们是 a 的唯一子级wx.Frame。要完成这项工作,您应该添加frmUsers与框架中的面板相关联的 sizer。

我认为也可能存在问题,getToolboxSizer因为那里的小部件似乎被直接添加到框架而不是面板中。您通常希望将子小部件添加到面板,以便选项卡可以正常工作。

我可能会更改onUsers为以下内容:

def onUsers(self, event=None):
    child_sizer = getToolboxSizer(self.panel)
    self.main_sizer.Add(child_sizer, 0, wx.ALL, 5)

然后更新getToolboxSizer,使其不会将所有小部件放在 上,parent因为父级现在将成为面板。

于 2018-04-19T19:13:55.837 回答