Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 修改内置WxPython小部件_Python 2.7_User Interface_Wxpython - Fatal编程技术网

Python 2.7 修改内置WxPython小部件

Python 2.7 修改内置WxPython小部件,python-2.7,user-interface,wxpython,Python 2.7,User Interface,Wxpython,如何修改wxPython中的组合框以下拉一个复选框,以便选择选项? 类似上面的东西。我知道ComboBox类是可用的,我需要继承它,将checkbox的特性添加到下拉列表中。但是我没有找到正确的开始方式。看看ComboCtrl类。它允许您提供实现组合下拉列表的窗口。wxPython演示中有一些示例。看看ComboCtrl类。它允许您提供实现组合下拉列表的窗口。wxPython演示中有一些示例。我还没有时间仔细阅读ComboCtrl,它看起来令人望而生畏。 但是,通过扭曲wx.Dialog,可以

如何修改wxPython中的组合框以下拉一个复选框,以便选择选项?


类似上面的东西。我知道ComboBox类是可用的,我需要继承它,将checkbox的特性添加到下拉列表中。但是我没有找到正确的开始方式。

看看
ComboCtrl
类。它允许您提供实现组合下拉列表的窗口。wxPython演示中有一些示例。

看看
ComboCtrl
类。它允许您提供实现组合下拉列表的窗口。wxPython演示中有一些示例。

我还没有时间仔细阅读
ComboCtrl
,它看起来令人望而生畏。
但是,通过扭曲
wx.Dialog
,可以获得您想要的近似值

import wx
import wx.lib.scrolledpanel as scrolled
class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "CheckBox Dialog",size=(400,250))
        self.panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.log = wx.TextCtrl(self.panel, wx.ID_ANY, size=(350,150),style = wx.TE_MULTILINE|wx.TE_READONLY|wx.VSCROLL)
        self.button = wx.Button(self.panel, label="Choose Colours")
        sizer.Add(self.log, 0, wx.EXPAND | wx.ALL, 10)
        sizer.Add(self.button, 0, wx.EXPAND | wx.ALL, 10)
        self.panel.SetSizer(sizer)
        self.Bind(wx.EVT_BUTTON, self.OnButton)
        self.panel.options = ['Red','Green','Black','White','Orange','Blue','Yellow']
        self.panel.selected = [0,0,0,0,0,0,0]

    def OnButton(self,event):
        dlg = ShowOptions(parent = self.panel)
        dlg.ShowModal()
        if dlg.result:
            result_text = 'Selected: '
            for item in range(len(dlg.result)):
                if dlg.result[item]:
                    result_text += self.panel.options[item]+' '
            self.log.AppendText(result_text+'\n\n')
            self.panel.selected = dlg.result
        else:
            self.log.AppendText("No selection made\n\n")
        dlg.Destroy()

class ShowOptions(wx.Dialog):
    def __init__(self, parent):
        self.options = parent.options
        self.selected = parent.selected
        o_str = ''
        for item in self.options:
            o_str = o_str+item+','
        wx.Dialog.__init__(self, parent, wx.ID_ANY, "CheckBoxes", size= (400,250))
        self.top_panel = wx.Panel(self,wx.ID_ANY)
        self.avail_options = wx.TextCtrl(self.top_panel, wx.ID_ANY, o_str,style = wx.TE_READONLY)
        self.bot_panel = wx.Panel(self,wx.ID_ANY)
        self.scr_panel = scrolled.ScrolledPanel(self,wx.ID_ANY)
        top_sizer = wx.BoxSizer(wx.VERTICAL)
        scr_sizer = wx.BoxSizer(wx.VERTICAL)
        bot_sizer = wx.BoxSizer(wx.VERTICAL)
        self.items = []
        for item in range(len(self.options)):
            self.item = wx.CheckBox(self.scr_panel,-1,self.options[item])
            self.item.SetValue(self.selected[item])
            self.items.append(self.item)
            self.item.Bind(wx.EVT_CHECKBOX, self.Select)
        self.saveButton =wx.Button(self.bot_panel, label="Save")
        self.closeButton =wx.Button(self.bot_panel, label="Cancel")
        self.saveButton.Bind(wx.EVT_BUTTON, self.SaveOpt)
        self.closeButton.Bind(wx.EVT_BUTTON, self.OnQuit)
        self.Bind(wx.EVT_CLOSE, self.OnQuit)

        top_sizer.Add(self.avail_options,0,flag=wx.EXPAND)
        for item in self.items:
            scr_sizer.Add(item,0)
        bot_sizer.Add(self.saveButton,0,flag=wx.CENTER)
        bot_sizer.Add(self.closeButton,0,flag=wx.CENTER)
        self.scr_panel.SetupScrolling()

        self.top_panel.SetSizer(top_sizer)
        self.scr_panel.SetSizer(scr_sizer)
        self.bot_panel.SetSizer(bot_sizer)

        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add(self.top_panel,0,flag=wx.EXPAND)
        mainsizer.Add(self.scr_panel,1,flag=wx.EXPAND)
        mainsizer.Add(self.bot_panel,0,flag=wx.EXPAND)
        self.SetSizer(mainsizer)
        self.Select(None)
        self.Show()

    def Select(self, event):
        selection = []
        for item in self.items:
            x = item.GetValue()
            selection.append(x)
        selected_text = ''
        for item in range(len(selection)):
            if selection[item]:
                    selected_text += self.options[item]+' '
            self.avail_options.SetValue(selected_text)

    def OnQuit(self, event):
        self.result = None
        self.Destroy()

    def SaveOpt(self, event):
        self.result = []
        for item in self.items:
            x = item.GetValue()
            self.result.append(x)
        self.Destroy()

app = wx.App()
frame = MyFrame(None)
frame.Show()
app.MainLoop()

我还没来得及钻研
ComboCtrl
,这看起来让人望而生畏。
但是,通过扭曲
wx.Dialog
,可以获得您想要的近似值

import wx
import wx.lib.scrolledpanel as scrolled
class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "CheckBox Dialog",size=(400,250))
        self.panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.log = wx.TextCtrl(self.panel, wx.ID_ANY, size=(350,150),style = wx.TE_MULTILINE|wx.TE_READONLY|wx.VSCROLL)
        self.button = wx.Button(self.panel, label="Choose Colours")
        sizer.Add(self.log, 0, wx.EXPAND | wx.ALL, 10)
        sizer.Add(self.button, 0, wx.EXPAND | wx.ALL, 10)
        self.panel.SetSizer(sizer)
        self.Bind(wx.EVT_BUTTON, self.OnButton)
        self.panel.options = ['Red','Green','Black','White','Orange','Blue','Yellow']
        self.panel.selected = [0,0,0,0,0,0,0]

    def OnButton(self,event):
        dlg = ShowOptions(parent = self.panel)
        dlg.ShowModal()
        if dlg.result:
            result_text = 'Selected: '
            for item in range(len(dlg.result)):
                if dlg.result[item]:
                    result_text += self.panel.options[item]+' '
            self.log.AppendText(result_text+'\n\n')
            self.panel.selected = dlg.result
        else:
            self.log.AppendText("No selection made\n\n")
        dlg.Destroy()

class ShowOptions(wx.Dialog):
    def __init__(self, parent):
        self.options = parent.options
        self.selected = parent.selected
        o_str = ''
        for item in self.options:
            o_str = o_str+item+','
        wx.Dialog.__init__(self, parent, wx.ID_ANY, "CheckBoxes", size= (400,250))
        self.top_panel = wx.Panel(self,wx.ID_ANY)
        self.avail_options = wx.TextCtrl(self.top_panel, wx.ID_ANY, o_str,style = wx.TE_READONLY)
        self.bot_panel = wx.Panel(self,wx.ID_ANY)
        self.scr_panel = scrolled.ScrolledPanel(self,wx.ID_ANY)
        top_sizer = wx.BoxSizer(wx.VERTICAL)
        scr_sizer = wx.BoxSizer(wx.VERTICAL)
        bot_sizer = wx.BoxSizer(wx.VERTICAL)
        self.items = []
        for item in range(len(self.options)):
            self.item = wx.CheckBox(self.scr_panel,-1,self.options[item])
            self.item.SetValue(self.selected[item])
            self.items.append(self.item)
            self.item.Bind(wx.EVT_CHECKBOX, self.Select)
        self.saveButton =wx.Button(self.bot_panel, label="Save")
        self.closeButton =wx.Button(self.bot_panel, label="Cancel")
        self.saveButton.Bind(wx.EVT_BUTTON, self.SaveOpt)
        self.closeButton.Bind(wx.EVT_BUTTON, self.OnQuit)
        self.Bind(wx.EVT_CLOSE, self.OnQuit)

        top_sizer.Add(self.avail_options,0,flag=wx.EXPAND)
        for item in self.items:
            scr_sizer.Add(item,0)
        bot_sizer.Add(self.saveButton,0,flag=wx.CENTER)
        bot_sizer.Add(self.closeButton,0,flag=wx.CENTER)
        self.scr_panel.SetupScrolling()

        self.top_panel.SetSizer(top_sizer)
        self.scr_panel.SetSizer(scr_sizer)
        self.bot_panel.SetSizer(bot_sizer)

        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add(self.top_panel,0,flag=wx.EXPAND)
        mainsizer.Add(self.scr_panel,1,flag=wx.EXPAND)
        mainsizer.Add(self.bot_panel,0,flag=wx.EXPAND)
        self.SetSizer(mainsizer)
        self.Select(None)
        self.Show()

    def Select(self, event):
        selection = []
        for item in self.items:
            x = item.GetValue()
            selection.append(x)
        selected_text = ''
        for item in range(len(selection)):
            if selection[item]:
                    selected_text += self.options[item]+' '
            self.avail_options.SetValue(selected_text)

    def OnQuit(self, event):
        self.result = None
        self.Destroy()

    def SaveOpt(self, event):
        self.result = []
        for item in self.items:
            x = item.GetValue()
            self.result.append(x)
        self.Destroy()

app = wx.App()
frame = MyFrame(None)
frame.Show()
app.MainLoop()

我按照罗宾·邓恩的建议,使用
wx.ComboCtrl
创建了一个小部件。 您可以随意使用它,也可以随意修改它

您还可以找到更高级的版本


我按照罗宾·邓恩的建议,使用
wx.ComboCtrl
创建了一个小部件。 您可以随意使用它,也可以随意修改它

您还可以找到更高级的版本