2012-04-03 7 views
0

Ich habe ein sehr sprunghaftes Problem hier. Die Menüleiste erscheint beim Ausführen zufällig. Ich habe mehrmals versucht, die Verwendung von self.SetMenuBar (self.menuBarr) im gesamten Programm zu wiederholen, aber es scheint nicht die Erfolgsquote zu beeinflussen. Kennt irgendjemand den Ort irgendeines Auslösers, der anzeigt, ob die Menüleiste angezeigt wurde oder nicht, so dass ich sie bei Bedarf automatisch neu laden kann?Menüleiste erscheint 50% der Zeit, wxPython, Ubuntu 11.10, Python 2.7, wxPython 2.8 GTK2

Alternativ habe ich einige ähnliche (aber unterschiedliche) Beiträge here und here gesehen, also wenn es sich um den notierten Fehler handelt, dann weiß jemand, wie ich den Hack (im ersten Link) anpassen würde, um für einen zu arbeiten einfache Menüleiste?

Es kann auch von nützlicher Information sein, dass der Aufruf der menu() -Methode vom Anfang bis zum Ende der Erstellungssequenz im ursprünglichen wx.Frame-Konstruktor verschoben wurde, aber die Zuverlässigkeit von die Menüleiste. Keine Ausnahme wird aufgerufen.

Vielen Dank im Voraus für jede Hilfe, die Sie anbieten können!

Code:

#!usr/bin/python 
#Window Manager - Owned by Main 


import wx, os, EmptyTestClass, isolationboard, controlpanel, logger, configmenu 


ID_BUTTON=100 
ID_EXIT=200 
ID_SPLITTER=300 

class WindowMan(wx.Frame): 
    def __init__(self, parent, gsettings): 
     logprefix='WindowMan Entry: ' 
     self.width=gsettings['width'] 
     self.height=gsettings['height'] 
     self.title=gsettings['title'] 
     self.dirname='~/' 
     self.main=parent 
     self.logman=logger.logg(logprefix) 
     self.app=wx.App(False) 
     super(WindowMan, self).__init__(None, title=self.title, size=(int(self.width), int(self.height))) 
     try: 
      self.menu() 
     except Exception, e: 
      self.logman.error("error creating file menu: "+str(e)) 
      print e 
     self.splitter=wx.SplitterWindow(self, ID_SPLITTER, style=wx.SP_3D) 
     self.testnames, self.testclasses=self.gettestnames(gsettings['tests']) 
     self.sashpos=32 
     self.InitTests() 
     self.InitUI() 
     self.show1() 



    def gettestnames(self, tests): #Helper which parses the test settings array 
     testnames=[] 
     testclasses=[] 
     testarr=tests.split(',') 
     for currtest in testarr: 
      temp=currtest.split(';') 
      if temp==None: 
       self.logman.error("Unable to load test "+currtest) 
      else: 
       testnames.append(temp[0]) 
       testclasses.append(temp[1]) 
     return testnames, testclasses 

    def menu(self): 
     #Create the Menu 
     filemenu= wx.Menu() 
     menuOpen = filemenu.Append(wx.ID_OPEN, "&Open"," Open a file to edit") 
     menuAbout= filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program") 
     menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program") 
     menuDConfig=filemenu.Append(wx.ID_PROPERTIES, "&Configuration", "Edit Configuration") 
     self.menuBarr = wx.MenuBar() 
     self.menuBarr.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar 
     print self.SetMenuBar(self.menuBarr) 
     # Events. 
     self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen) 
     self.Bind(wx.EVT_MENU, self.OnExit, menuExit) 
     self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout) 
     self.Bind(wx.EVT_MENU, self.OnConfig, menuDConfig) 


    def OnConfig(self, e): 
     self.logman.debug("Config menu called") 
     self.configframe=configmenu.configmenu(self) 

    def InitUI(self): 
     try: 
      self.panel=controlpanel.controlpanel(self.splitter, self, self.testnames) #splitter must be parent 
      self.splitter.SplitHorizontally(self.panel, self.test[0],self.sashpos) #Splitter function, 40 specifies size of top section 
      self.splitter.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED,self.fixsash) 
      self.splitter.SetMinimumPaneSize(20) 
      self.currwindow=self.test[0] #Start with first test as default window 
      self.logman.info("Main UI Constructed Successfully") 
     except Exception, e: 
      self.logman.error("Error creating control panel object: "+str(e)) 



    def InitTests(self): 
     self.test=[] 
     for classtorun in self.testclasses: 
      try: 
       if classtorun=="isolation": 
        self.test.append(isolationboard.isolation(self.splitter)) 
       elif classtorun=="emptytest": 
        self.test.append(EmptyTestClass.emptytest(self.splitter)) 
       else: 
        self.logman.error("Encountered unknown test class reference: "+str(classtorun)+". Please check config file.") 
        raise Exception('Unknown Test Class Implemented In Config File: '+str(classtorun)) 
      except Exception as inst: 
       self.logman.error(inst) 
     self.logman.info("Main UI Constructed Successfully") 

    def show1(self): #Shows and starts app 
     self.Centre() 
     self.Show() 
     self.app.MainLoop() 

    def OnAbout(self,e): 
     # Create a message dialog box 
     dlg = wx.MessageDialog(self, "blahblahblah") 
     dlg.ShowModal() # Shows it 
     dlg.Destroy() # finally destroy it when finished. 

    def OnExit(self,e): 
     self.Close(True) # Close the frame. 

    def OnOpen(self,e): #Not used yet, taken from wxPython example for convenience 
     """ Open a file""" 
     dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN) 
     if dlg.ShowModal() == wx.ID_OK: 
      self.filename = dlg.GetFilename() 
      self.dirname = dlg.GetDirectory() 
      f = open(os.path.join(self.dirname, self.filename), 'r') 
      self.control.SetValue(f.read()) 
      f.close() 
     dlg.Destroy() 

    def fixsash(self, event): #Fixes splitter window if accidentally resized. 
     self.splitter.SetSashPosition(self.sashpos) 

    def switchpanel(self, event): 
     try: 
      button=event.GetEventObject() 
      #self.Hide() 
      self.logman.debug("pressed button: "+button.GetLabel()) 
      testtoswitch=self.testnames.index(button.GetLabel()) 
      self.splitter.Unsplit(self.currwindow) 
      self.currwindow=self.test[testtoswitch] 
      self.splitter.SplitHorizontally(self.panel, self.test[testtoswitch],self.sashpos) 
      self.splitter.SetMinimumPaneSize(20) 
      self.splitter.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED,self.fixsash) 
      #self.Show() 
     except Exception, e: 
      self.logman.error("Error in Panel switch: "+str(e)) 

UPDATE Nun ist diese beginnt, wirklich seltsam zu bekommen. Ich habe das Problem gelöst, indem ich das Programm mit Administratorrechten ausgeführt habe. Zu keinem Zeitpunkt fallen Skripte, die von einem meiner Skripte fallen gelassen werden. Daher bin ich völlig ratlos, warum das so ist.

Antwort

0

Wird das Menü in der Taskleiste angezeigt, wie bei einem Mac? Ich denke, es gibt einige Einstellungen in den neueren Ubuntu-Versionen, die Menüs deaktivieren. Ich kann mich nicht erinnern, wie es jetzt heißt, aber ich denke, du musst ein Addon installieren oder es wird nur abhängig vom Thema deaktiviert. Siehe auch http://wxpython-users.1045709.n5.nabble.com/help-no-show-menubar-in-ubuntu-td3292261.html

Sie erwähnen nicht, welches wxPython Sie verwenden. Wenn es nicht 2.8.12 ist, versuchen Sie es zu aktualisieren und sehen Sie, ob es behoben ist: https://groups.google.com/forum/?fromgroups#!topic/wxpython-users/7tx9i1TpfZc