我已经设置了一个wxpython GUI,它有一个菜单栏和菜单栏中的一些项目。我想要做的是在我的菜单栏中选择一个项目(例如文件 - 选项),当我选择“选项”时会弹出一个对话框,我可以在我的代码中设置不同的参数。类似的行为将是wx.FontDialog和wx.FileDialog - 但是,我希望我的自定义,因为我可以将单选按钮和复选框作为可选选项。我该怎么做呢?
我的代码片段是:
这里是我设置主应用程序和GUI的一部分(我在另一部分设置了布局和框大小调整器):
class TMainForm(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.Splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER)
self.PlotPanel = wx.Panel(self.Splitter, -1)
self.FilePanel = wx.Panel(self.Splitter, -1)
#self.SelectionPanel = wx.Panel(self.Splitter,-1)
self.Notebook = wx.Notebook(self.FilePanel, -1)#, style=0)
self.ReportPage = wx.Panel(self.Notebook, -1)
self.FilePage = wx.Panel(self.Notebook, -1)
这是我设置菜单栏的一部分:
self.MainMenu = wx.MenuBar()
self.FileMenu = wx.Menu()
self.OptimizeMenu = wx.Menu()
self.HelpMenu = wx.Menu()
self.OptimizeOptions= wx.MenuItem(self.OptimizeMenu, 302, "&Select Parameters","Select Parameters for Optimization",wx.ITEM_NORMAL)
self.OptimizeMenu.AppendItem(self.OptimizeOptions)
self.MainMenu.Append(self.OptimizeMenu, "&Optimization")
这是我将事件绑定到菜单栏的“选项”部分的位置。当我点击它时,我想要一个弹出菜单对话框来显示
self.Bind(wx.EVT_MENU, self.OnOptimizeOptions, self.OptimizeOptions)
这是我希望定义弹出菜单的功能。如果可能的话,我想用这种格式(而不是单独的类)。
def OnOptimizeOptions(self,event):
give me a dialog box (radio buttons, check boxes, etc)
我只显示了片段,但我的所有代码都有效。我的GUI和菜单栏设置正确 - 我只是不知道如何获得像wx.FileDialog和wx.FontDialog菜单的弹出菜单。任何帮助都会很棒!感谢
答案 0 :(得分:2)
您可能希望在处理程序中实例化一个对话框(OnOptimizeOptions)。基本上你会继承Wx.Dialog并放入你想要的任何小部件。然后你在你的处理程序中实例化它并调用ShowModal。像这样的伪代码:
myDlg = MyDialog(*args)
myDlg.ShowModal()
有关示例,请参阅zetcodes网站上的自定义对话框部分:http://zetcode.com/wxpython/dialogs/(靠近底部)。
编辑 - 以下是一个例子:
import wx
########################################################################
class MyDialog(wx.Dialog):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Dialog.__init__(self, None, title="Options")
radio1 = wx.RadioButton( self, -1, " Radio1 ", style = wx.RB_GROUP )
radio2 = wx.RadioButton( self, -1, " Radio2 " )
radio3 = wx.RadioButton( self, -1, " Radio3 " )
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(radio1, 0, wx.ALL, 5)
sizer.Add(radio2, 0, wx.ALL, 5)
sizer.Add(radio3, 0, wx.ALL, 5)
for i in range(3):
chk = wx.CheckBox(self, label="Checkbox #%s" % (i+1))
sizer.Add(chk, 0, wx.ALL, 5)
self.SetSizer(sizer)
########################################################################
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")
# Add a panel so it looks the correct on all platforms
self.panel = wx.Panel(self, wx.ID_ANY)
menuBar = wx.MenuBar()
fileMenu = wx.Menu()
optionsItem = fileMenu.Append(wx.NewId(), "Options",
"Show an Options Dialog")
self.Bind(wx.EVT_MENU, self.onOptions, optionsItem)
exitMenuItem = fileMenu.Append(wx.NewId(), "Exit",
"Exit the application")
self.Bind(wx.EVT_MENU, self.onExit, exitMenuItem)
menuBar.Append(fileMenu, "&File")
self.SetMenuBar(menuBar)
#----------------------------------------------------------------------
def onExit(self, event):
""""""
self.Close()
#----------------------------------------------------------------------
def onOptions(self, event):
""""""
dlg = MyDialog()
dlg.ShowModal()
dlg.Destroy()
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm().Show()
app.MainLoop()