Перекрывающиеся виджеты (элементы управления) в wxPython BoxSizer
Я добавляю элементы в горизонтальный wx.BoxSizer, но вместо того, чтобы располагаться рядом друг с другом, они отображаются друг над другом (все они расположены в пиксельной позиции (0,0) родительской панели).
Ниже приведены сокращенные версии файлов (соответствующие части):
main.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
Что мне не хватает?
1 ответ
В main.py
, случай UsersForm
не внутри сортировщика. Панели не заполняют своих родителей автоматически, за исключением случаев, когда они являются единственными wx.Frame
, Чтобы сделать эту работу, вы должны добавить frmUsers
к классификатору, связанному с панелью в раме.
Я думаю, что также может быть проблема в getToolboxSizer
поскольку виджеты там добавляются непосредственно к фрейму, а не к панели. Обычно вы хотите добавить дочерние виджеты в Panel, чтобы вкладки работали правильно.
Я бы наверное поменял onUsers
к следующему:
def onUsers(self, event=None):
child_sizer = getToolboxSizer(self.panel)
self.main_sizer.Add(child_sizer, 0, wx.ALL, 5)
Затем обновите getToolboxSizer
поэтому он не размещает все свои виджеты на parent
так как родитель теперь будет панелью.