Search code examples
windowswxpython

Resizing a wx python dialog does not work on windows


I have a dialog that I want to be resizable. It works perfectly on Linux, but on Windows it will not resize.

I know there is a get around using a wx.Frame and MakeModal, but why won't this work?

import wx


class TestDialog(wx.Dialog):
    MIN_SIZE = (200, 100)
    def __init__(self, *args, **kwargs):
        super(TestDialog, self).__init__(None, *args, **kwargs)
        self.panel = MainPanel(self)
        self.Title = 'Test dialog'
        self.Bind(wx.EVT_CLOSE, self.on_quit_click)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel)
        self.SetSizer(sizer)

        self.SetMinSize(self.MIN_SIZE)
        self.SetSize(self.MIN_SIZE)

        self.status = wx.ID_CANCEL

    def on_cmd_ok_click(self, event):
        self.status = wx.ID_OK
        self._tear_down

    def on_quit_click(self, event):
        self._tear_down()

    def _tear_down(self):
        self.Destroy()


class MainPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super(MainPanel, self).__init__(parent, *args, **kwargs)
        self.parent = parent

        name_sizer = self._name_sizer(parent)
        button_sizer = self._button_sizer(parent)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(name_sizer, flag=wx.EXPAND)
        sizer.Add(button_sizer, flag=wx.EXPAND)
        self.SetSizer(sizer)

    def _name_sizer(self, parent):
        lbl_name = wx.StaticText(self, label='Name:')
        self.txt_name = wx.TextCtrl(self, size=(2000, -1))
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(lbl_name, flag=wx.ALIGN_CENTER)
        sizer.Add(self.txt_name, flag=wx.EXPAND)
        return sizer

    def _button_sizer(self, parent):
        cmd_action = wx.Button(self, id=wx.ID_OK)
        cmd_cancel = wx.Button(self, wx.ID_EXIT)
        cmd_action.Bind(wx.EVT_BUTTON, parent.on_cmd_ok_click)
        cmd_cancel.Bind(wx.EVT_BUTTON, parent.on_quit_click)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(cmd_action)
        sizer.Add((0, 0), proportion=1)
        sizer.Add(cmd_cancel)
        return  sizer

if __name__ == '__main__':
    wx_app = wx.App()
    TestDialog().ShowModal()
    wx_app.MainLoop()

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus consectetur ex arcu, a iaculis mi vestibulum vel. Nullam iaculis sed nunc at dictum. Quisque tincidunt vulputate quam ut posuere. Maecenas scelerisque, odio vitae placerat tempus, metus mauris cursus erat, quis vulputate mauris turpis sit amet urna. In hac habitasse platea dictumst. Nulla eu justo viverra ante consequat euismod non ac nisi. Nunc sit amet nulla porttitor, dictum ex ut, venenatis quam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut nec odio ac ex ullamcorper commodo. Aenean et leo justo. Maecenas iaculis purus vel metus lobortis convallis. Ut nisi nisl, dapibus eget nunc et, fringilla facilisis mi. Ut justo sem, tempus in tellus eu, faucibus ultricies elit. Nam maximus sem lorem, porttitor porta mauris eleifend id. Integer condimentum dolor non vehicula tincidunt. Ut augue velit, placerat ut efficitur et, scelerisque et nulla.


Solution

  • The problem is that you are using the default style of a wx.Dialog and this seems to change from one OS to the other.

    You only need to define your custom style by changing the line:

    super(TestDialog, self).__init__(None, *args, **kwargs)
    

    to:

    super(TestDialog, self).__init__(None, *args, style=wx.RESIZE_BORDER|wx.CAPTION|wx.CLOSE_BOX, **kwargs)