wx.Layout почему-то «убирает» виджеты с панели - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь выучить wxPython и застрял с проблемой макета. Я стараюсь размещать наборы виджетов внутри отдельных панелей, чтобы управлять их положением \ размером в будущем. Но по какой-то причине код, который отлично работает для панели «Верхний блок», не работает для панели «Моды».

Я погуглил функцию Layout (), но по какой-то причине она ведет себя по-разному в "Top block" и "Mods". Вместо того, чтобы переставлять виджеты, он просто помещает их все в тонкую линию сверху панели. Я не могу публиковать изображения, но могу предоставить скриншот.

class ItemInfo(wx.Frame):
    def __init__(self, parent, item, *args):
        super(ItemInfo, self).__init__(parent)
        self.Size = wx.Size(500, 600)

        self.current_item = self.find_current_item(item)
        common_item_types = Storage.ItemStorage.get_common_item_keys()

        # self.Bind(wx.EVT_SHOW, self.show_current_item_stats)
        mod_list = []
        mod_list.append("None")
        for key, value in Storage.item_storage.mod_dict.items():
            mod_list.append(key)

        # Главная панель
        main_panel = wx.Panel(self)
        main_panel.SetBackgroundColour('#484f49')

        ##============================= Шрифты ===============================##

        label_font = wx.Font(16, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)
        sublabel_font = wx.Font(12, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)
        stat_font = wx.Font(16, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)

        # ============================= Заголовок ======================================
        label_panel = wx.Panel(main_panel, pos=(0, 0))
        label_panel.SetSize(500, 30)
        label_panel.SetBackgroundColour('#46f057')
        label_text = wx.StaticText(label_panel, label="Item information")
        label_text.SetFont(label_font)
        label_text.SetForegroundColour('#6b756c')
        label_text.SetPosition((170, 5))


        ##================================ Top block ==========================

        top_panel = wx.Panel(main_panel, pos=(10, 30))
        top_panel.SetSize(470, 70)
        top_panel.SetBackgroundColour('#1271e6')
        top_sizer = wx.BoxSizer(wx.HORIZONTAL)

        # Создаем коробку с именем предмета
        item_name_sizer = wx.BoxSizer(wx.VERTICAL)

        item_name_label = wx.StaticText(top_panel, label="Current item name")
        item_name_label.SetFont(sublabel_font)
        item_name_ctrl = wx.TextCtrl(top_panel, value=self.current_item.name)

        item_name_sizer.AddSpacer(7)
        item_name_sizer.Add(item_name_label, 0, wx.ALIGN_CENTER_HORIZONTAL)
        item_name_sizer.AddSpacer(5)
        item_name_sizer.Add(item_name_ctrl, wx.EXPAND)
        top_sizer.Add(item_name_sizer, 0, wx.LEFT | wx.RIGHT, border=5)

        # Создаем коробку с типом предмета
        item_key_sizer = wx.BoxSizer(wx.VERTICAL)

        item_key_label = wx.StaticText(top_panel, label="Item key")
        item_key_label.SetFont(sublabel_font)
        item_key_cbox = wx.ComboBox(top_panel, value=self.current_item.key, choices=common_item_types)

        item_key_sizer.AddSpacer(7)
        item_key_sizer.Add(item_key_label, 0, wx.ALIGN_CENTER_HORIZONTAL)
        item_key_sizer.AddSpacer(5)
        item_key_sizer.Add(item_key_cbox, wx.EXPAND)
        top_sizer.Add(item_key_sizer, 0, wx.LEFT | wx.RIGHT, border=5)

        # Создаем коробку с редкостью предмета
        item_rarity_sizer = wx.BoxSizer(wx.VERTICAL)

        item_rarity_label = wx.StaticText(top_panel, label="Item rarity")
        item_rarity_label.SetFont(sublabel_font)
        item_rarity_cbox = wx.ComboBox(top_panel, value=self.current_item.rarity.key, choices=BaseStats.RARITY_LIST)

        item_rarity_sizer.AddSpacer(7)
        item_rarity_sizer.Add(item_rarity_label, 0, wx.ALIGN_CENTER_HORIZONTAL)
        item_rarity_sizer.AddSpacer(5)
        item_rarity_sizer.Add(item_rarity_cbox, wx.EXPAND)
        top_sizer.Add(item_rarity_sizer, 0, wx.LEFT | wx.RIGHT, border=5)

        top_panel.SetSizer(top_sizer)
        top_panel.Layout()

        # =============================== Mods ==================================

        mod_panel = wx.Panel(main_panel, pos=(10, 200))
        mod_panel.SetSize(470, 70)
        mod_panel.SetBackgroundColour('#6b756c')
        # mod_sizer = wx.BoxSizer(wx.VERTICAL)
        mod_intermediate_sizer = wx.BoxSizer(wx.HORIZONTAL)

        # Коробка с первым модом
        first_mod_sizer = wx.BoxSizer(wx.VERTICAL)

        first_mod_label = wx.StaticText(mod_panel, label="First mod")
        first_mod_label.SetFont(sublabel_font)
        first_mod_cbox = wx.ComboBox(mod_panel, value=self.current_item.mod_list[0].key, choices=mod_list)

        first_mod_sizer.AddSpacer(7)
        first_mod_sizer.Add(first_mod_label, 0, flag=wx.ALIGN_CENTER_HORIZONTAL)
        first_mod_sizer.AddSpacer(20)
        first_mod_sizer.Add(first_mod_cbox, flag=wx.EXPAND)
        mod_intermediate_sizer.Add(first_mod_sizer, 0, wx.LEFT | wx.RIGHT, border=5)

        # Коробка со вторым модом
        second_mod_sizer = wx.BoxSizer(wx.VERTICAL)

        second_mod_label = wx.StaticText(mod_panel, label='Second mod')
        second_mod_label.SetFont(sublabel_font)
        second_mod_cbox = wx.ComboBox(mod_panel, value=self.current_item.mod_list[1].key,
                                      choices=mod_list)

        second_mod_sizer.AddSpacer(7)
        second_mod_sizer.Add(second_mod_label, 0, flag=wx.ALIGN_CENTER_HORIZONTAL)
        second_mod_sizer.AddSpacer(5)
        second_mod_sizer.Add(second_mod_cbox, 0, flag=wx.EXPAND)
        mod_intermediate_sizer.Add(second_mod_sizer, 0, flag=wx.LEFT | wx.RIGHT, border=5)

        mod_panel.SetSizer(mod_intermediate_sizer)
        mod_intermediate_sizer.Layout()
'''

1 Ответ

1 голос
/ 08 октября 2019

Не следует вызывать Layout для sizer вместо панели. Но эй, забавно, как ты сам находишь ответы после публикации вопросов +)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...