title: Cannot get LabelFrame widget to display on ttk notebook (python 3.5.1)
body: <p>I have an application in which the (tkinter) LabelFrame widget on the tab of a ttk Notebook will not update itself.  In a  much simplified version of that program (code extracts below) the widget will not even appear on the GUI.  </p>
  
  <p>Everything else on the GUI works properly, including updating the tab titles, the application title (and icon) and updating  the Label, Checkbutton and Radiobutton widgets on all notebook tabs.  Using the ttk versions (e.g. ttk.LabelFrame) to create those widgets did not fix the issue.  I also tried using “update_idletasks” (some think this as a kludge) immediately after updating the widget attributes without success. </p>
  
  <p>In the real application the text of all GUI widgets change according to the state of a “choose language” widget on the same GUI (for details, see: <a href="https://stackoverflow.com/questions/37061859/need-python-tkinter-gui-to-dynamically-update-itself-for-a-multi-lingual-gui">Need Python/tkinter GUI to dynamically update itself (for a multi-lingual GUI)</a>). It’s known that all GUI text values (the WidgetName["text”] attribute), including the missing LabelFrame, are being correctly updated to match the state of that widget.</p>
  
  <p>Is there something “special” about  LabelFrame widgets on Notebook tabs?  What (probably simple) thing am I overlooking?<br>
  Also, any confirmation/denial by others will help determine if the problem is unique to my system - a distinct possiblity since my machine is administered by corporate IM (who don't have the best record when handling the needs of unusual users like me). </p>
  
  <p>Thanks</p>
  
  <hr>
  
  <p>The following is a complete example of the problem.  When run, the LabelFrame widget (which should appear at (0, 0) of Tab 1) does not appear.  Clicking on the "language" widget causes everything else to display text in the language selected by the "language" widget. </p>
  
  <p>From “LanguageInUse.py”  the code that switches languages:</p>
  
  <pre><code>import sys
  
  c_cedille_lower    = "\u00E7" #  UTF 8/16 (code page 863?) French character
  e_circumflex_lower = "\u00EA"
  
  English  = 'English'                            # string shown on GUI
  Francais = 'Fran' + c_cedille_lower + 'ais'    # string shown on GUI
  
  DefaultLanguage = Francais
  DefaultLanguage = English       # comment out this line to use French
  
  user_language = DefaultLanguage     # set up language shown on GUI
  
  # Define all language-dependent GUI strings (as "Application-Level" globals)
  
  ComplianceMessage   = None
  ReportTab1Title     = None
  ReportTab2Title     = None
  XCheckbuttonMessage = None
  XLabelFrameMessage  = None
  XLabelMessage       = None
  XRadioButtonMessage = None
  
  '''=========================================================================='''
  
  def SetGuiLanguage( user_language ) :
  
      global  ComplianceMessage, LanguagePrompt        
      global  ReportTab1Title, ReportTab2Title 
      global XLabelFrameMessage, XCheckbuttonMessage, XLabelMessage, XRadioButtonMessage
  
      if ( user_language == English ):    
          LanguagePrompt      = "Language"
          ReportTab1Title     = "Message Counts"
          ReportTab2Title     = "Communications Compliance"
          XLabelFrameMessage  = "LabelFrame"
          XCheckbuttonMessage = "Checkbox"
          XLabelMessage       = "Label"
          XRadioButtonMessage = 'Radiobutton'
          ComplianceMessage  = "Compliance (engish)"        
      elif ( user_language == Francais ):    
          LanguagePrompt     = "Langage"
          ReportTab1Title    = "Comtes de message"
          ReportTab2Title    = "Compliance Communications"
          XLabelFrameMessage  = "LabelFrame en "  + Francais
          XCheckbuttonMessage = "Checkbox en "    + Francais
          XLabelMessage       = "Label en "       + Francais
          XRadioButtonMessage = "Radiobutton en " + Francais
          ComplianceMessage  =  "Compliance - "   + Francais        
      else:   
          print (' An unknown user language was specified' )   
          sys.exit()
  
      return
  
  '''==========================================================================''' 
  
  SetGuiLanguage( user_language )     # initialize all tkinter strings at startup
  
  '''==========================  End of File  ================================''' 
  </code></pre>
  
  <p>From “SelectReports.py”) the code that builds the notebook:</p>
  
  <pre><code>from tkinter import Checkbutton, Radiobutton, Label, LabelFrame, Frame
  from tkinter import ttk 
  
  import LanguageInUse
  
  # Locally defined entities importable by other modules (often
  # Tkinter Application level objects whose language can be changed)
  
  ComplianceMessageText    = None
  NotebookFrame            = None
  
  XCheckbutton = None
  XLabel       = None
  XLabelFrame  = None  # NOT APPEARING ON THE GUI 
  XRadiobutton = None
  
  '''==========================================================================''' 
  
  def TabbedReports( ParentFrame ) :
  
      global ComplianceMessageText,  NotebookFrame 
      global SelectReportFrame, UplinkFileWarningText 
      global XCheckbutton, XLabel, XLabelFrame, XRadiobutton
  
      # Builds the notebook and it's widgits
  
      NotebookFrame = ttk.Notebook( ParentFrame )   
      NotebookFrame.grid( row = 0, column = 1 )
  
      Tab1Frame = Frame( NotebookFrame ) 
      Tab2Frame = Frame( NotebookFrame ) 
  
      NotebookFrame.add( Tab1Frame )
      NotebookFrame.add( Tab2Frame )
  
      # Create widgets on Tab 1
  
      XLabelFrame  = LabelFrame(  Tab1Frame )  # NOT APPEARING ON GUI
      XCheckbutton = Checkbutton( Tab1Frame )
      XLabel       = Label(       Tab1Frame )
      XRadiobutton = Radiobutton( Tab1Frame )
  
      XLabelFrame.grid(  row = 1, column = 0 )  # NOT ON GUI 
      XCheckbutton.grid( row = 1, column = 1 )    
      XLabel.grid(       row = 2, column = 0 )  
      XRadiobutton.grid( row = 2, column = 1 )
  
      XLabelFrame.configure(  text = LanguageInUse.XLabelFrameMessage )   # NOT ON GUI 
      XCheckbutton.configure( text = LanguageInUse.XCheckbuttonMessage )
      XLabel.configure(       text = LanguageInUse.XLabelMessage )
      XRadiobutton.configure( text = LanguageInUse.XRadioButtonMessage )
  
       #  .tab() gives same effect as .configure() for other widget types 
  
      NotebookFrame.tab( 0 , text = LanguageInUse.ReportTab1Title )
      NotebookFrame.tab( 1 , text = LanguageInUse.ReportTab2Title )
  
      # Create the only widget on Tab 2  (uses other method to specify text)
  
      ComplianceMessageText = Label( Tab2Frame )
      ComplianceMessageText.grid(  row = 0, column = 0 )    
      ComplianceMessageText['text']  = LanguageInUse.ComplianceMessage 
  
      return
  </code></pre>
  
  <p>From  “ChangeLanguageOnGui.py” the code that updates all notebook widgets:</p>
  
  <pre><code>import sys, os
  from tkinter import StringVar, Radiobutton, PhotoImage
  
  #from TkinterRoot import root
  
  import LanguageInUse
  import SelectReports
  
  '''==========================================================================''' 
  
  def ChangeLanguageOnGui() :    
  
      SelectReports.XLabelFrame.configure(  text = LanguageInUse.XLabelFrameMessage )   # NOT ON GUI 
      SelectReports.XCheckbutton.configure( text = LanguageInUse.XCheckbuttonMessage )
      SelectReports.XLabel.configure(       text = LanguageInUse.XLabelMessage )
      SelectReports.XRadiobutton.configure( text = LanguageInUse.XRadioButtonMessage )
  
      #  .tab() gives the same effect as .configure() for other widget types
  
      SelectReports.NotebookFrame.tab( 0 , text = LanguageInUse.ReportTab1Title )
      SelectReports.NotebookFrame.tab( 1 , text = LanguageInUse.ReportTab2Title )
  
      SelectReports.ComplianceMessageText['text']  = LanguageInUse.ComplianceMessage
  
  '''==========================================================================''' 
  
  def SetUpGuiLanguage( LanguageFrame ) :
  
      GUI_Language = StringVar( value = LanguageInUse.user_language )
  
      #---------------------------------------------------------------------------
      def switchLanguage():  
  
          LanguageInUse.user_language = GUI_Language.get()                
          LanguageInUse.SetGuiLanguage( LanguageInUse.user_language )   
  
          ChangeLanguageOnGui()
  
          return
  
      #---------------------------------------------------------------------------
  
      UsingEnglish = Radiobutton( LanguageFrame, indicatoron = False,
                                  variable = GUI_Language,
                                  command = lambda: switchLanguage(),
                                  value =  LanguageInUse.English )  
      UsingFrancais = Radiobutton( LanguageFrame, indicatoron = False,
                                   variable = GUI_Language,
                                   command = lambda: switchLanguage(),
                                   value = LanguageInUse.Francais )    
      UsingEnglish.grid(  row = 0, column = 0 )    
      UsingFrancais.grid( row = 1, column = 0 )
  
      UsingEnglish.configure(  text = LanguageInUse.English )
      UsingFrancais.configure( text = LanguageInUse.Francais )    
  </code></pre>
  
  <p>From "TkinterRoot.py" the code that makes root importable everywhere (explictly importing this avoided problems such as IntVar() being unavailable during the intitialization phase of other modules):</p>
  
  <pre><code>from tkinter import Tk  # possibly the worlds shortest useful python module
  
  root = Tk()             # makes root an importable "Application Level" global
  </code></pre>
  
  <p>And finally "A.py", the mainline file:</p>
  
  <pre><code>from TkinterRoot import root 
  
  from tkinter import LabelFrame
  from tkinter import ttk
  
  import ChangeLanguageOnGui, LanguageInUse, SelectReports, sys
  
  LanguageFrame      = None
  
  if __name__ == "__main__":
  
      LanguageChoice = LanguageInUse.English 
  
      if ( LanguageChoice == LanguageInUse.English ) :
          LanguageInUse.user_language = LanguageChoice
      elif ( LanguageChoice == 'Francais' ) :
          LanguageInUse.user_language = LanguageInUse.Francais
      else :
          print( "Unknown Language: " + LanguageChoice  )
          sys.exit()
  
      mainframe = ttk.Frame( root )
      mainframe.grid( row = 0, column = 0 )
  
      LanguageFrame = LabelFrame( mainframe, text = LanguageInUse.LanguagePrompt )
      LanguageFrame.grid( row = 0, column = 0 )
  
      ChangeLanguageOnGui.SetUpGuiLanguage( LanguageFrame )
  
      SelectReports.TabbedReports( mainframe ) 
  
      try:  
          root.mainloop()     
      except:
          print( 'Exception Occurred' )        
  
  sys.exit()
  </code></pre>
  
  <p>The Environment is 64-bit Python 3.5.1, 64-bit Win 7 Enterprise SP 1,  64-bit Eclipse Mars 2 (the Java EE IDE edition) running  64-bit PyDev 5.1.2.201606231256.  The "one user" (no admin rights) version of Pydev was used, this required Microsoft patch KB2999226 (part of Win10) to run on Win7.  Eventual target distribution is a 32-bit Windows app (so it can run on 32 &amp; 64 bit Windows) - and if/when time permits - Linux.     </p>
  
  <p>There’s one minor complication to keep in mind: In the real program several packages are being used.  Inside each package each function is isolated inside its own file.  All objects (e.g. the tkinter widgets) that must be externally visible (or need be shared amongst the package’s files) are declared in the package’s _ _ init.py _ _ file.  Functions that must be externally visible are explicitly imported into _ _ init.py _ _ by using relative imports (e.g.  “from  .Function1  import  Function1” ).   </p>