ここで非常に不安定な問題が発生しています。実行すると、メニューバーがランダムに表示されます。プログラム全体で 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))
更新 これは本当に奇妙になり始めています。管理者権限でプログラムを実行することで問題を解決しました。私のスクリプトがシェル コマンドをドロップすることは決してないので、なぜこれが起こっているのか完全に困惑しています。