pythonbuttonsliderwxpythonboxsizer

wxPython - cannot press on BUTTON or move SLIDER


WORKS ON (Linux Mint, Python 2.7.5, wxPython 2.8.12.1 (gtk2-unicode)), but not with Windows 7. Can someone else with Windows try?

I have created a GUI with a great layout using wxPython. However, button and slider don't work in one of the panels. Please provide some guidance for me. (code runs fine, but button cannot be pressed and cannot move slider)

import wx

class MainWindow(wx.Frame):

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

        self.InitUI()

    def InitUI(self):
        self.SetSize((1300, 700))
        self.SetTitle('GUI made by James')

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('#4f5049')
        mainPanel = wx.Panel(self.panel)
        mainPanel.SetBackgroundColour('#ededed')

        sub_vbox = wx.BoxSizer(wx.VERTICAL)
        subPanel_top = wx.Panel(mainPanel)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hierarchy_browser = wx.TextCtrl(subPanel_top, style = wx.TE_MULTILINE)
        hbox.Add(hierarchy_browser, proportion = 1, flag = wx.TOP | wx.BOTTOM | wx.LEFT | wx.EXPAND, border = 10)
        subPanel_right = wx.Panel(mainPanel)
        wx.StaticText(subPanel_right, -1, "This is custom static text", (10, 10), (300, -1), wx.ALIGN_CENTER)
        button = wx.Button(subPanel_right, label = "exit", pos = (500, 100), size = (60, 60)) #can't press for some reason
        slider = wx.Slider(subPanel_right, -1, 50, 1, 100, pos = (320, 10), size = (250, -1), style = wx.SL_AUTOTICKS | wx.SL_LABELS)  # can't slide for some reason
        slider.SetTickFreq(5, 1)

        hbox.Add(subPanel_right, proportion = 1, flag = wx.TOP | wx.BOTTOM | wx.LEFT | wx.EXPAND, border = 10)
        subPanel_top.SetSizer(hbox)

        sub_vbox.Add(subPanel_top, 1, wx.EXPAND)

        subPanel_bottom = wx.Panel(mainPanel)
        text_entry = wx.TextCtrl(subPanel_bottom, style = wx.TE_MULTILINE)
        text_sizer = wx.BoxSizer()  # use sizer to expand TextCtrl
        text_sizer.Add(text_entry, 1, flag = wx.LEFT | wx.RIGHT |  wx.BOTTOM | wx.EXPAND, border = 10)
        subPanel_bottom.SetSizerAndFit(text_sizer)
        sub_vbox.Add(subPanel_bottom, 1, wx.EXPAND)
        mainPanel.SetSizer(sub_vbox)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(mainPanel, 1, wx.EXPAND | wx.ALL, 10)
        self.panel.SetSizer(vbox)

        self.Bind(wx.EVT_BUTTON, self.closebutton, button)
        self.Bind(wx.EVT_CLOSE, self.closewindow)

        self.Centre()
        self.Show(True)

    def closebutton(self, event):
        self.Close(True)

    def closewindow(self, event):
        self.Destroy()

def main():
    ex = wx.App()
    MainWindow(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()

Solution

  • your subPanel_right has no size since you simply attached objects to it rather than using a sizer... so when the sizer it is in resizes it its size is none and you cannot click

    one solution is to set the size of the panel

    subPanel_right = wx.Panel(subPanel_top,-1,size=(560,300))
    

    you may need to do somehting funny after and do

    subPanel_right.SetMinSize(560,300)
    

    to force it to be that size and not resize (I dunno it worked for me without that, but sometimes I have to do that)

    In general you should not mix absolute layouts with Sizer controlled layouts .... for instance one panel with a flexgridbagsizer would probably have sufficed ... or one panel with some tricky boxlayouts