Python — wxpython Как предотвратить падение BoxSizer при изменении размера окна?

Я использую BoxSizer как горизонтальный и вертикальный макет. Однако, когда я использую вертикаль BoxSizer в горизонтальном BoxSizer чтобы содержать мои кнопки, чтобы они отображались вертикально рядом с другим элементом, а когда вы изменяете его размер, он сворачивается и скрывает кнопки, пока вы не развернете его снова.

Вот как это выглядит по умолчанию
введите описание изображения здесь

и вот как это выглядит после того, как мы изменили его размеры до меньшей ширины
введите описание изображения здесь

Как вы можете видеть, кнопки сворачиваются при изменении размера. Как вы предотвращаете сворачивание BoxSizer при изменении размера окна?

Код

0

Решение

Во-первых, полужесткое правило размещения вашего кода в вопросе, а не по ссылке, состоит в том, чтобы люди могли видеть, изменили ли вы его, что у вас есть!

Ваш код теперь изменился, поэтому становится трудно объяснить изменения, внесенные в исходный код, и то, как они связаны с новым кодом.

По сути, при использовании sizer вы должны обращать особое внимание на пропорции и флаги wx.EXPAND. Они могут вызвать всевозможные непреднамеренные последствия.

Лично я бы, наверное, работал с другим сайзером, возможно FlexGridSizer за это.

Вот ваш оригинальный код, с proportion и расширить flags настроен на выполнение того, что я предполагаю, что вы хотели

import wx
from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin

#from processor import process_xls

class MainFrame(wx.Frame):

TITLE = 'Neko'
FRAME_MIN_SIZE = (600, 300)
DEFAULT_BORDER_SIZE = 10

INPUT_LABEL = 'Input files : '
ADD_LABEL = 'Add'

REMOVE_LABEL = 'Remove'
START_LABEL = 'Start'

FILE_LABEL = 'File'
SIZE_LABEL = 'Size'
PERCENT_LABEL = 'Percent'
ETA_LABEL = 'ETA'
SPEED_LABEL = 'Speed'
STATUS_LABEL = 'Status'
STATUS_LIST = {
'filename': (0, FILE_LABEL, 120, True),
'size': (1, SIZE_LABEL, 60, False),
'percent': (2, PERCENT_LABEL, 80, False),
'eta': (3, ETA_LABEL, 60, False),
'speed': (4, SPEED_LABEL, 60, False),
'status': (5, STATUS_LABEL, 90, False),
}

def __init__(self, *args, **kwargs):
super(MainFrame, self).__init__(*args, **kwargs)

self.SetTitle(self.TITLE)
self.SetSize(self.FRAME_MIN_SIZE)

self._panel = wx.Panel(self)
self._vertical_box = wx.BoxSizer(wx.VERTICAL)

# Inputs
self._horizontal_box_input = wx.BoxSizer(wx.HORIZONTAL)

self._tc_file_picker = wx.TextCtrl(self._panel)
self._horizontal_box_input.Add(self._tc_file_picker,
proportion=1, flag=wx.EXPAND)

self._button_add = wx.Button(self._panel,
label=self.ADD_LABEL,
size=(-1,-1))
self._button_add.Bind(wx.EVT_BUTTON,
self._on_add)
self._horizontal_box_input.Add(self._button_add,
flag=wx.LEFT,
border=self.DEFAULT_BORDER_SIZE)

self._vertical_box.Add(self._horizontal_box_input,
flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP,
border=self.DEFAULT_BORDER_SIZE)

# Status List
self._status_list = ListCtrl(self.STATUS_LIST,
parent=self._panel,
style=wx.LC_REPORT | wx.LEFT | wx.RIGHT)
self._horizontal_box_status_list = wx.BoxSizer(wx.HORIZONTAL)
self._horizontal_box_status_list.Add(self._status_list,
proportion=1, flag=wx.EXPAND)

status_list_buttons_data = {
('remove', self.REMOVE_LABEL, (-1, -1), self._on_remove, wx.Button),
('start', self.START_LABEL, (-1, -1), self._on_start, wx.Button),
}

# Create buttons vertically
self._vertical_control_box = wx.BoxSizer(wx.VERTICAL)
for item in status_list_buttons_data:
name, label, size, evt_handler, parent = item

button = parent(self._panel, size=size)

if parent == wx.Button:
button.SetLabel(label)

if evt_handler is not None:
button.Bind(wx.EVT_BUTTON, evt_handler)

self._vertical_control_box.Add(button,
flag=wx.LEFT|wx.BOTTOM|wx.EXPAND,
proportion=1,
border=self.DEFAULT_BORDER_SIZE)

self._horizontal_box_status_list.Add(self._vertical_control_box)

self._vertical_box.Add(self._horizontal_box_status_list,
flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP,
border=self.DEFAULT_BORDER_SIZE)

# Set Sizer
self._panel.SetSizerAndFit(self._vertical_box)

#If you want the listctrl and textctrl to have a minimum size
#open_size = self.GetSize()
#self.SetMinSize(open_size)

self.Show()

def _on_add(self, event):
pass

def _on_remove(self, event):
pass

def _on_start(self, event):
pass

class ListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin):
def __init__(self, columns, *args, **kwargs):
super(ListCtrl, self).__init__(*args, **kwargs)
ListCtrlAutoWidthMixin.__init__(self)

self.columns = columns
self._set_columns()

def _set_columns(self):
for column_item in sorted(self.columns.values()):
self.InsertColumn(column_item[0], column_item[1], width=wx.LIST_AUTOSIZE_USEHEADER)

# If the column width obtained from wxLIST_AUTOSIZE_USEHEADER
# is smaller than the minimum allowed column width
# then set the column width to the minumum allowed size
if self.GetColumnWidth(column_item[0]) < column_item[2]:
self.SetColumnWidth(column_item[0], column_item[2])

# Set auto-resize if enabled
if column_item[3]:
self.setResizeColumn(column_item[0])
if __name__ == "__main__":

app = wx.App()
MainFrame(None)
app.MainLoop()

На открытом:введите описание изображения здесь
По расширению:введите описание изображения здесь
На уменьшение:введите описание изображения здесь

0

Другие решения

Sizer просто раскладывает элементы по доступному размеру. Если этого недостаточно, у сортировщика нет другого выбора, кроме как обрезать (или даже полностью скрыть) некоторые элементы.

Чтобы этого не произошло, вы должны убедиться, что ваше окно не может быть меньше его минимального размера. Это сделано с SetMinClientSize() который называется удобным SetSizerAndFit() обертка, ни одна из которых не используется в вашем коде.

1

По вопросам рекламы [email protected]