wxPython Demo example for NotificationMessage doesn't work on 4.3.1?

Testing on Linux Mint 22.3.

When I ran the NotificationMessage example from the wxPython Demo on 4.3.1, I noticed that no notification appeared when I pressed the button and no error messages appeared in the terminal. However, the same code on 4.2.5 does show a notification.

Here is a simplified standalone version of the example:

import wx
import wx.adv

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.btn = wx.Button(self, -1, "Notify me of something...!", pos=(50,50))
        self.btn.Bind(wx.EVT_BUTTON, self.OnButton)

    def OnButton(self, event):
        notify = wx.adv.NotificationMessage(
            title="This is a Notification!",
            message="wxPython is awesome. Phoenix is awesomer! Python is awesomest!!\n\n"
                    "The quick brown fox jumped over the lazy dog.",
            parent=None, flags=wx.ICON_INFORMATION)

        notify.Show(timeout=5)

class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.SetSize((300, 200))
        self.SetTitle("Test Notification Message")
        TestPanel(self)
        self.Layout()

if __name__ == '__main__':
    app = wx.App()
    frame = TestFrame()
    frame.Show()
    app.MainLoop()

I also downloaded the following raw test files from the master branch on GitHub:
https://github.com/wxWidgets/Phoenix/blob/7488693a120925af94f4c375e5e4b9c610b0d6f6/unittests/test_notifmsg.py
https://github.com/wxWidgets/Phoenix/blob/7488693a120925af94f4c375e5e4b9c610b0d6f6/unittests/wtc.py

I modified test_notifymsg.py to import the wtc module from the current directory and extended the duration the timeout to give:

import unittest
import wtc
import wx
import wx.adv

#---------------------------------------------------------------------------

class notifmsg_Tests(wtc.WidgetTestCase):

    def test_notifmsg1(self):
        nf = wx.adv.NotificationMessage("The Title", "This is the message")
        nf.Show()
        self.waitFor(3000)
        nf.Close()


#---------------------------------------------------------------------------

if __name__ == '__main__':
    unittest.main()

When I ran that test file on 4.3.1, it did show a notification.

Does anyone know why the unittest works on 4.3.1, but the demo example doesn’t?

It appears to be something to do with passing timeout=5 to the Show() method.

If I replace the line

        notify.Show(timeout=5)

with:

        notify.Show()
        wx.CallLater(5000, notify.Close)

Then it does work on 4.3.1.

It looks like the reason it doesn’t work in your original example is that when OnButton exits, the notify object gets garbage collected and thus the notification is not shown. The reason adding wx.CallLater fixes it is that wx.CallLater is holding on to a reference to notify.

As to why this worked in 4.2.5, I’m not sure.