Re: Re: wx.BusyInfo does not stick to parent, stays on top of other applications

Matthias Brennwald <[email protected]> Fri, 01 Jan 2021 13:05:30 +0100
Newsgroups gmane.comp.python.wxpython
Message-ID <[email protected]>
On Wed, Dec 30, 2020 at 09:06, Alexander Makarenko 
<[email protected]> wrote:

> I'm having the same issue, did you find a solution by any chance?

Sorry for taking so long to reply on this. My solution was to ditch 
wx.BusyInfo, because it simply does not work as I think it should. I 
also considered the AGW solution, but that was very different from the 
native look-and-feel of the GUI, so I didn't look into this any further.

Here's how I made the "busy display" work for my case. My application 
works with a "main" window. So I decided to implement the "busy 
display" as part of my main window (code snipped below). Now I just use 
calls to frame_main.busy_box.activate( ... ), 
frame_main.busy_box.deactivate( ... ) and frame_main.busy_box.setup( 
.. ) to control the busy display from the main thread or from the 
separate long-running thread (wrapped into wx.CallAfter where 
necessary).

Cheers
Matthias


--------------------------------------------------


class frame_main(wx.Frame):

	def __init__(self,app):

		...

		# Create "busy display" dialog box:
		self.busy_box = busy_display(self)

		...


--------------------------------------------------


class busy_display(wx.Dialog):

	def __init__(self, parent):
		# Create the dialog box
		wx.Dialog.__init__(self, parent, style = wx.SIMPLE_BORDER )
		self._panel = None
		self.setup('Plase wait...')
		self._is_active = False

	def setup(self, infotext):
		if self._panel is not None:
			# kill the panel before recreating a new one:
			self._panel.Destroy()
		self._panel = wx.Panel(self, -1)
		msg = wx.StaticText(self._panel, label=infotext, 
style=wx.ALIGN_CENTRE_HORIZONTAL )
		h_sizer = wx.BoxSizer(wx.HORIZONTAL)
		main_sizer = wx.BoxSizer(wx.VERTICAL)
		h_sizer.Add(msg, 0, wx.CENTER)
		main_sizer.Add((0,0), 1, wx.EXPAND)
		main_sizer.Add(h_sizer, 0, wx.CENTER)
		main_sizer.Add((0,0), 1, wx.EXPAND)
		self._panel.SetSizer(main_sizer)
		siz = main_sizer.ComputeFittingWindowSize(self)
		siz.IncBy(wx.Size(80,50))
		self.SetSize(siz)

	def activate(self, message = 'Please wait...'):
		# Show the dialog in modal mode
		if not self._is_active:
			self.setup(message)
			self._is_active = True
			self.ShowModal()

	def deactivate(self):
		# End the modal dialog (from the long-running process thread)
		if self._is_active:
			self.EndModal(0)
			self._is_active = False

-- 
You received this message because you are subscribed to the Google Groups "wxPython-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/6989MQ.4E20WAVAWOYU%40gmail.com.