ComboCtrl с всплывающим окном CheckListBox - EVT_CHECKLISTBOX не работает - PullRequest
1 голос
/ 10 марта 2019

После моего последнего поста я узнал, что могу комбинировать ComboCtrl с всплывающим окном Checklistbox. Все идет нормально. Теперь я пытаюсь выяснить, почему EVT_CHECKLISTBOX не работает должным образом. Неужели я связал это неправильно?

self.lc.Bind(wx.EVT_CHECKLISTBOX, self.OnSelect)

Также:

  • как сделать так, чтобы всплывающее окно соответствовало содержанию? На данный момент это довольно огромный
  • как мне изменить Combobox, чтобы он больше не заполнял все окно?

Вот мой код:

import wx
import wx.stc
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT |
                wx.SUNKEN_BORDER)
        CheckListCtrlMixin.__init__(self)
        ListCtrlAutoWidthMixin.__init__(self)  

class ListViewComboPopup(wx.ComboPopup):
    def __init__(self):
        wx.ComboPopup.__init__(self)
        self.lc = None

    def AddItem(self, txt):
        self.lc.InsertItem(0, txt)

    def OnSelect(self, event):
        print("Working fine!")

    def Init(self):
        self.value = -1
        self.curitem = -1

    def Create(self, parent):
        self.lc = CheckListCtrl(parent)
        self.lc.InsertColumn(0, '', width=90)

        self.lc.Bind(wx.EVT_CHECKLISTBOX, self.OnSelect)
        return True

    def GetControl(self):
        return self.lc

    def OnPopup(self):
        wx.ComboPopup.OnPopup(self)

class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Popup Menu Tutorial")

        comboCtrl = wx.ComboCtrl(self, wx.ID_ANY, "")        
        popupCtrl = ListViewComboPopup()
        comboCtrl.SetPopupControl(popupCtrl)

        popupCtrl.AddItem("Test 1")
        popupCtrl.AddItem("Test 2")
        popupCtrl.AddItem("Test 3") 

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

1 Ответ

2 голосов
/ 10 марта 2019

OnCheckItem вызывается CheckListCtrlMixin.
Добавьте панель к фрейму и установите родительский элемент ComboCtrl в качестве панели
Измените возвращаемое значение метода GetAdjustedSize метода ComboPopup, чтобы изменить размер

import wx
import wx.stc
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin


class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):

    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT | 
                wx.SUNKEN_BORDER)
        CheckListCtrlMixin.__init__(self)
        ListCtrlAutoWidthMixin.__init__(self)
        self.SetSize(-1, -1, -1, 50)

    def OnCheckItem(self, index, flag):
        item = self.GetItem(index)
        if flag:
            what = "checked"
        else:
            what = "unchecked"

        print(f'{item.GetText()} - {what}')


class ListViewComboPopup(wx.ComboPopup):

    def __init__(self):
        wx.ComboPopup.__init__(self)
        self.lc = None

    def AddItem(self, txt):
        self.lc.InsertItem(0, txt)


    def Init(self):
        self.value = -1
        self.curitem = -1

    def Create(self, parent):
        self.lc = CheckListCtrl(parent)
        self.lc.InsertColumn(0, '', width=90)
        return True

    def GetControl(self):
        return self.lc

    def OnPopup(self):
        wx.ComboPopup.OnPopup(self)

    def GetAdjustedSize(self, minWidth, prefHeight, maxHeight):
        return wx.ComboPopup.GetAdjustedSize(
            self, minWidth, 110, maxHeight)


class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Popup Menu Tutorial")
        panel = wx.Panel(self)

        comboCtrl = wx.ComboCtrl(panel, wx.ID_ANY, "Select filter")    
        popupCtrl = ListViewComboPopup()
        comboCtrl.SetPopupControl(popupCtrl)

        popupCtrl.AddItem("Test 1")
        popupCtrl.AddItem("Test 2")
        popupCtrl.AddItem("Test 3") 


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