0

ここで非常に不安定な問題が発生しています。実行すると、メニューバーがランダムに表示されます。プログラム全体で self.SetMenuBar(self.menuBarr) の使用を何度か繰り返してみましたが、成功率には影響していないようです。必要に応じて自動的に再読み込みできるように、メニューバーが表示されているかどうかを示すトリガーの場所を知っている人はいますか?

あるいは、似たような (しかし異なる) 投稿をいくつか見たことがあるので、それが指摘されバグに関連している場合、単純なメニュー バーで機能するように (最初のリンクで) ハックを調整する方法を知っている人はいますか?

menu() メソッドの呼び出しが、最初の wx.Frame コンストラクターの作成シーケンスの最初から最後に移動されたことも有益な情報かもしれませんが、メニュー バー項目の信頼性には影響しませんでした。 . 例外は呼び出されません。

あなたが提供できる助けを前もってありがとう!

コード:

#!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))

更新 これは本当に奇妙になり始めています。管理者権限でプログラムを実行することで問題を解決しました。私のスクリプトがシェル コマンドをドロップすることは決してないので、なぜこれが起こっているのか完全に困惑しています。

4

1 に答える 1

0

メニューは Mac のようにタスクバー領域に表示されますか? 新しいUbuntuリリースには、メニューを無効にする設定があると思います。今は何と呼ばれているのか思い出せませんが、アドオンをインストールする必要があるか、テーマによっては無効になるだけだと思います。http://wxpython-users.1045709.n5.nabble.com/help-no-show-menubar-in-ubuntu-td3292261.htmlも参照してください

使用している wxPython については言及していません。2.8.12 でない場合は、それにアップグレードして、修正されているかどうかを確認してください: https://groups.google.com/forum/?fromgroups#!topic/wxpython-users/7tx9i1TpfZc

于 2012-04-17T16:15:24.277 に答える