Метка флажка wxpython не отображается полностью, некоторые буквы скрыты другими - PullRequest
0 голосов
/ 19 декабря 2018

У меня много флажков, и они имеют разную длину метки. Когда я использую гридзайзер, чтобы показать их, метка отображается не полностью.Я считаю, что, когда количество флажков растет, размер диалога остается неизменным. Как я могу показать все флажки и метки? Ниже приведены код и изображение:

# -*- coding: utf-8 -*-
import wx
import math


class Example(wx.Dialog):
    def __init__(self, cb_titles, title):
        super().__init__(None, title=title)
        self.cb_labels = cb_titles
        self.panel = wx.Panel(self)
        self.initUI()
        self.Centre()
        self.ShowModal()

    def initUI(self):
        vbox = wx.BoxSizer(wx.VERTICAL)  # I use vbox here because I need to add other items below this grid sizer, not shown in the example.
        self.set_grid(vbox)
        border = wx.BoxSizer()
        border.Add(vbox, 1, wx.ALL | wx.EXPAND, 10)
        self.panel.SetSizer(border)
        self.panel.Fit()

    def set_grid(self, vbox):
        n_cbs = len(self.cb_labels)
        n_col = int(math.sqrt(n_cbs))
        n_row = n_col
        while n_row * n_col < n_cbs:
            n_row += 1
        sb = wx.StaticBox(self.panel, -1, 'CheckBoxes:')
        sb_sizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
        grid_sizer = wx.GridSizer(n_row, n_col, 30)

        for i in range(n_cbs):
            cb_label = self.cb_labels[i]
            cb = wx.CheckBox(self.panel, label=cb_label)
            grid_sizer.Add(cb, 1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
        sb_sizer.Add(grid_sizer, 1, wx.ALL|wx.CENTER, 10)
        vbox.Add(sb_sizer, 1, wx.CENTER, 0)





app = wx.App()
cb_titles = ["aaaaaaaaaaa", "bbbbbbb", "cccccccccc", "ddddddd", "eeeeeeee", "ffffffffff", "DDDDDDDDDD", 'FFFFFFFFFFFFFF', "GGGGGGGGGG"] * 3  # you can change this number
Example(cb_titles, title ='Question Example')
app.MainLoop()

enter image description here

IЕсли вы хотите использовать виджет Диалог, вы можете видеть на картинке, что этикетка отображается не полностью. Кроме того, когда я нажимаю крестик, диалоговое окно закрывается, но программа не заканчивается, как правильно его завершить?

1 Ответ

0 голосов
/ 19 декабря 2018

Я думаю, что вам нужно будет рассчитать и установить размер диалога, основываясь на самой длинной длине метки (я могу ошибаться).

Самая длинная строка в списке может быть найдена с помощью:

max(a_list,key=len)

Вам также нужно будет найти размер точек символов, которые вы используете.

Это мой первый удар по вашему коду, надеюсь, вы найдете его полезным, если не совсем то, что вам нужно.

# -*- coding: utf-8 -*-
import wx
import math


class Example(wx.Dialog):
    def __init__(self, cb_titles, title):
        super().__init__(None, title=title)
        self.cb_labels = cb_titles
        self.panel = wx.Panel(self)
        self.initUI()
        self.Centre()

    def initUI(self):
        vbox = wx.BoxSizer(wx.VERTICAL)  # I use vbox here because I need to add other items below this grid sizer, not shown in the example.
        self.set_grid(vbox)
        border = wx.BoxSizer()
        border.Add(vbox, 1, wx.ALL | wx.EXPAND, 10)
        self.panel.SetSizer(border)
        self.panel.Fit()

    def set_grid(self, vbox):
        n_cbs = len(self.cb_labels)
        n_col = int(math.sqrt(n_cbs))
        n_row = n_col
        while n_row * n_col < n_cbs:
            n_row += 1
        sb = wx.StaticBox(self.panel, -1, 'CheckBoxes:')
        sb_sizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
        grid_sizer = wx.GridSizer(n_row, n_col, 30)

        for i in range(n_cbs):
            cb_label = self.cb_labels[i]
            cb = wx.CheckBox(self.panel, label=cb_label)
            grid_sizer.Add(cb, 1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
        sb_sizer.Add(grid_sizer, 1, wx.ALL|wx.CENTER, 10)
        vbox.Add(sb_sizer, 1, wx.CENTER, 0)

        #Set the size based on the number of columns and
        #the length of the longest label + margins
        self.font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
        pt = self.font.GetPointSize()
        w=(len(max(self.cb_labels,key=len))*n_col)+(pt*(n_col - 1))
        w=(w*pt)
        self.SetSize(w,-1)

app = wx.App()
cb_titles = ["aaaaaaaaaaa", "bbbbbbb", "cccccccccc", "ddddddd", "eeeeeeee", "ffffffffff", "DDDDDDDDDD", 'FFFFFFFFFFFFFF', "GGGGGGGGGG"] * 5  # you can change this number

dlg = Example(cb_titles, title ='Question Example')
dlg.ShowModal()
dlg.Destroy()
app.MainLoop()

Наконец, выньте ShowModal() из диалога и поместитеэто снаружи, так что вы можете использовать функцию Destroy(), которая правильно завершит диалог.
Вы можете оставить ShowModal в диалоге, но тогда вам также придется кодировать Destroy.

enter image description here

...