Beginner / hidden window?

I have a probably simple problem, but already spent two days unable to solve it.
here is my code: (not the nicest, I know)

#-----------------------------------------------------------------------------------------------------------------------------
#!/usr/bin/env python
import wx
import time
from math import pi


try:
    from agw import speedmeter as SM
except ImportError: # if it's not there locally, try the wxPython lib.
    import wx.lib.agw.speedmeter as SM

pressure1 = 0
pressure2 = 20
pressure3 = 60
pressure4 = 140
pressure5 = 35
pressure6 = 110
pressure7 = 45
pressure8 = 33
#----------------------------------------------------------------------
#######  Beginning Of SPEEDMETER Demo wxPython Code
#----------------------------------------------------------------------
class SpeedMeterDemo(wx.Panel):

    def __init__(self, parent):
        global pressure1
        global pressure2
        global pressure3
        global pressure4
        global pressure5
        global pressure6
        global pressure7
        global pressure8
        

        wx.Panel.__init__(self, parent) #, style=wx.TAB_TRAVERSAL|wx.NO_FULL_REPAINT_ON_RESIZE)

        
        panel = wx.Panel(self,  -1, size=(1000,1000))
        sizer = wx.FlexGridSizer(rows=2, cols=4, vgap=5, hgap=5)
        # 6 Panels To Hold The SpeedMeters ;-)

        panel1 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel2 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel3 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel4 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel5 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel6 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel7 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
        panel8 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER)
 

        self.SpeedWindow1 = self.SpeedMeterX(panel1)
        self.SpeedWindow2 = self.SpeedMeterX(panel2)
        self.SpeedWindow3 = self.SpeedMeterX(panel3)
        self.SpeedWindow4 = self.SpeedMeterX(panel4)
        self.SpeedWindow5 = self.SpeedMeterX(panel5)
        self.SpeedWindow6 = self.SpeedMeterX(panel6)
        self.SpeedWindow7 = self.SpeedMeterX(panel7)
        self.SpeedWindow8 = self.SpeedMeterX(panel8)
  
 
#-----------------------------------------------------------------------------------------------------------------
        bsizer1 = wx.BoxSizer(wx.VERTICAL)
        bsizer1.Add(self.SpeedWindow1, 1, wx.EXPAND)
        panel1.SetSizer(bsizer1)
#-----------------------------------------------------------------------------------------------------------------
        bsizer2 = wx.BoxSizer(wx.VERTICAL)
        bsizer2.Add(self.SpeedWindow2, 1, wx.EXPAND)
        panel2.SetSizer(bsizer2)
#-----------------------------------------------------------------------------------------------------------------
        bsizer3 = wx.BoxSizer(wx.VERTICAL)
        bsizer3.Add(self.SpeedWindow3, 1, wx.EXPAND)
        panel3.SetSizer(bsizer3)
#-----------------------------------------------------------------------------------------------------------------
        bsizer4 = wx.BoxSizer(wx.VERTICAL)
        bsizer4.Add(self.SpeedWindow4, 1, wx.EXPAND)
        panel4.SetSizer(bsizer4)
#-----------------------------------------------------------------------------------------------------------------
        bsizer5 = wx.BoxSizer(wx.VERTICAL)
        bsizer5.Add(self.SpeedWindow5, 1, wx.EXPAND)
        panel5.SetSizer(bsizer5)
#-----------------------------------------------------------------------------------------------------------------
        bsizer6 = wx.BoxSizer(wx.VERTICAL)
        bsizer6.Add(self.SpeedWindow6, 1, wx.EXPAND)
        panel6.SetSizer(bsizer6)
#-----------------------------------------------------------------------------------------------------------------
        bsizer7 = wx.BoxSizer(wx.VERTICAL)
        bsizer7.Add(self.SpeedWindow7, 1, wx.EXPAND)
        panel7.SetSizer(bsizer7)
#-----------------------------------------------------------------------------------------------------------------
        bsizer8 = wx.BoxSizer(wx.VERTICAL)
        bsizer8.Add(self.SpeedWindow8, 1, wx.EXPAND)
        panel8.SetSizer(bsizer8)




        sizer.Add(panel1, 1, wx.EXPAND)
        sizer.Add(panel2, 1, wx.EXPAND)
        sizer.Add(panel3, 1, wx.EXPAND)
        sizer.Add(panel4, 1, wx.EXPAND)
        sizer.Add(panel5, 1, wx.EXPAND)
        sizer.Add(panel6, 1, wx.EXPAND)
        sizer.Add(panel7, 1, wx.EXPAND)
        sizer.Add(panel8, 1, wx.EXPAND)


        sizer.AddGrowableRow(0)
        sizer.AddGrowableRow(1)

        sizer.AddGrowableCol(0)
        sizer.AddGrowableCol(1)
        sizer.AddGrowableCol(2)
        sizer.AddGrowableCol(3)    #sky59

        panel.SetSizer(sizer)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(panel, 1, wx.EXPAND)
        self.SetSizer(mainSizer)
        mainSizer.Layout()


        self.SpeedWindow1.SetSpeedValue(pressure1)  
        self.SpeedWindow2.SetSpeedValue(pressure2)  
        self.SpeedWindow3.SetSpeedValue(pressure3)  
        self.SpeedWindow4.SetSpeedValue(pressure4)  
        self.SpeedWindow5.SetSpeedValue(pressure5)  
        self.SpeedWindow6.SetSpeedValue(pressure6)  
        self.SpeedWindow7.SetSpeedValue(pressure7)  
        self.SpeedWindow8.SetSpeedValue(pressure8)  
        self.on_timer()

    def SpeedMeterX(self,panel_x):
        # First SpeedMeter: We Use The Following Styles:
        #
        # SM_DRAW_HAND: We Want To Draw The Hand (Arrow) Indicator
        # SM_DRAW_SECTORS: Full Sectors Will Be Drawn, To Indicate Different Intervals
        # SM_DRAW_MIDDLE_TEXT: We Draw Some Text In The Center Of SpeedMeter
        # SM_DRAW_SECONDARY_TICKS: We Draw Secondary (Intermediate) Ticks Between
        #                          The Main Ticks (Intervals)
        SpeedWindow_x = SM.SpeedMeter(panel_x,
                                          agwStyle=SM.SM_DRAW_HAND |
                                          SM.SM_DRAW_SECTORS |
                                          SM.SM_DRAW_MIDDLE_TEXT |
                                          SM.SM_DRAW_SECONDARY_TICKS
                                          )

        # Set The Region Of Existence Of SpeedMeter (Always In Radians!!!!)
        SpeedWindow_x.SetAngleRange(-pi/6, 7*pi/6)

        # Create The Intervals That Will Divide Our SpeedMeter In Sectors
        intervals = range(0, 201, 20)
        SpeedWindow_x.SetIntervals(intervals)

        # Assign The Same Colours To All Sectors (We Simulate A Car Control For Speed)
        # Usually This Is Black
        colours = [wx.BLACK]*10
        SpeedWindow_x.SetIntervalColours(colours)

        # Assign The Ticks: Here They Are Simply The String Equivalent Of The Intervals
        ticks = [str(interval) for interval in intervals]
        SpeedWindow_x.SetTicks(ticks)
        # Set The Ticks/Tick Markers Colour
        SpeedWindow_x.SetTicksColour(wx.WHITE)
        # We Want To Draw 5 Secondary Ticks Between The Principal Ticks
        SpeedWindow_x.SetNumberOfSecondaryTicks(5)

        # Set The Font For The Ticks Markers
        SpeedWindow_x.SetTicksFont(wx.Font(7, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))

        # Set The Text In The Center Of SpeedMeter
        SpeedWindow_x.SetMiddleText("kPa")
        # Assign The Colour To The Center Text
        SpeedWindow_x.SetMiddleTextColour(wx.WHITE)
        # Assign A Font To The Center Text
        SpeedWindow_x.SetMiddleTextFont(wx.Font(15, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))

        # Set The Colour For The Hand Indicator
        SpeedWindow_x.SetHandColour(wx.Colour(255, 50, 0))

        # Do Not Draw The External (Container) Arc. Drawing The External Arc May
        # Sometimes Create Uglier Controls. Try To Comment This Line And See It
        # For Yourself!
        SpeedWindow_x.DrawExternalArc(False)

        # Set The Current Value For The SpeedMeter
        SpeedWindow_x.SetSpeedValue(0)
		
        return SpeedWindow_x

    def OnInit(self):

        frame = wx.Frame(None, -1, "MojTest: " ,style=wx.SYSTEM_MENU | wx.RESIZE_BORDER)

        frame.Show(True)
        frame.SetSize((480, 320))                                           
        frame.SetPosition((0,0))			
        SpeedMeterDemo(frame)  
        

    def on_timer(self):
         global pressure1
         global pressure2
         global pressure3
         global pressure4
         global pressure5
         global pressure6
         global pressure7
         global pressure8
		 
         
         #--------------------------------------------
         if pressure1 < 180:
          pressure1 = pressure1 + 3
         else:
          pressure1 = 0	  
         self.SpeedWindow1.SetSpeedValue(pressure1) 
         #--------------------------------------------
         if pressure2 < 180:
          pressure2 = pressure2 + 6
         else:
          pressure2 = 0	  
         self.SpeedWindow2.SetSpeedValue(pressure2) 
         #--------------------------------------------
         if pressure3 < 180:
          pressure3 = pressure3 + 9
         else:
          pressure3 = 0	  
         self.SpeedWindow3.SetSpeedValue(pressure3) 
         #--------------------------------------------
         if pressure4 < 180:
          pressure4 = pressure4 + 12
         else:
          pressure4 = 0	  
         self.SpeedWindow4.SetSpeedValue(pressure4) 
         #--------------------------------------------
         if pressure5 < 180:
          pressure5 = pressure5 + 15
         else:
          pressure5 = 0	  
         self.SpeedWindow5.SetSpeedValue(pressure5) 
         #--------------------------------------------
         if pressure6 < 180:
          pressure6 = pressure6 + 18
         else:
          pressure6 = 0	  
         self.SpeedWindow6.SetSpeedValue(pressure6) 
         #--------------------------------------------
         if pressure7 < 170:
          pressure7 = pressure7 + 21
         else:
          pressure7 = 0	  
         self.SpeedWindow7.SetSpeedValue(pressure7) 
         #--------------------------------------------
         if pressure8 < 170:
          pressure8 = pressure8 + 24
         else:
          pressure8 = 0	  
         self.SpeedWindow8.SetSpeedValue(pressure8) 

         self.Update()
         wx.CallLater(200, self.on_timer)


app = wx.App(False)   #ak true tak vypisuje do okna tie suradnice

SpeedMeterDemo.OnInit(None)

app.MainLoop()



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

problem is, my eight instruments are not shown
if I “shake” window, they suddenly appear (I know they run already but invisible)

if I remove wx.RESIZE_BORDER flag, then I can not shake window
if I have/add wx.CAPTION or wx.CLOSE_BOX then instruments are visible but also menu bar space is there which I do not want

where I make mistake? something is missing? Thanx for help!!

        frame = wx.Frame(None, -1, "MojTest: " ,style=wx.SYSTEM_MENU | wx.RESIZE_BORDER)
        frame.Show(True)
        frame.SetSize((480, 320))
        frame.SetPosition((0,0))
        SpeedMeterDemo(frame)

Since the size of the frame is fixed before any children are added to it, then there is no initial size event happening after children (the SppedMeterDemo object) have been added to the frame. Since there is no size event then the initial layout does not happen, since the automatic layout (via sizers or the frame-with-one-child feature). So to work around this, you can simply add frame.SendSizeEvent() to send an artificial event which will trigger the initial layout.

Whenever you have a situation where manually resizing the frame causes the proper layout to happen then the cause is usually something like this case. Depending on the context then calling SendSizeEvent or perhaps Layout on the window with layout problems will likely help with the fix.

1 Like

Thank you! I will try it on Monday.
Do you mean to add it after SpeedMeterDemo(frame)?

Yes. Moving the Show to the end of that block may also solve the problem, as there is usually a size event when a top-level window is shown.

Thanx!!!
Moving Show at the end helped!