从pygame App调用wx Dialog并返回一个值

时间:2015-01-12 15:38:23

标签: python wxpython pygame

我正试图从我的pygame应用程序运行的wx对话框中获取一些值。我是wxPython的新手,从未做过任何OOP,所以我需要一些帮助。现在它有点工作,至少对话框显示和关闭成功。但是我不知道我需要在对话框方法中添加什么来在关闭对话框后处理对话框的输入。我把相关的代码放在这里。它使用http://zetcode.com/wxpython/dialogs/中的示例 我的dial.py模块:

import wx

class OptionsDial(wx.Dialog):

    def __init__(self, *args, **kw):
        super(OptionsDial, self).__init__(*args, **kw) 

        self.InitUI()
        self.SetSize((300, 200))
        self.SetTitle("Import options")


    def InitUI(self):

        pnl = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        sb = wx.StaticBox(pnl, label='Import')
        sbs = wx.StaticBoxSizer(sb, orient=wx.VERTICAL)        
        sbs.Add(wx.RadioButton(pnl, label='PNG', style=wx.RB_GROUP))
        sbs.Add(wx.RadioButton(pnl, label='TIFF'))
        sbs.Add(wx.RadioButton(pnl, label='JPEG'))

        pnl.SetSizer(sbs)

        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        okButton = wx.Button(self, label='Ok')
        closeButton = wx.Button(self, label='Close')
        hbox2.Add(okButton)
        hbox2.Add(closeButton, flag=wx.LEFT, border=5)

        vbox.Add(pnl, proportion=1, flag=wx.ALL|wx.EXPAND, border=5)
        vbox.Add(hbox2, flag=wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, border=10)

        self.SetSizer(vbox)

        okButton.Bind(wx.EVT_BUTTON, self.OnClose)
        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

    def OnClose(self, e):
        self.Destroy()
        self.Close()

请注意,我必须在onClose方法中添加self.Close()行,否则它根本不起作用。在我的主程序中,我称之为(它没有读取所选的选项,现在我只是尝试让它返回一些不同的结果,这取决于现在按下什么按钮而且我被卡住了):

def options() :
    ff = "PNG"
    app = wx.App(None)
    dlg = dial.OptionsDial(None)
    if dlg.ShowModal() == wx.ID_OK :
        ff = "JPG"      
    return ff

现在我的函数返回" PNG"总是。那么如何让它返回一个值取决于: 1.选中单选按钮(实际上我只需要单选按钮的索引) 2.按下按钮(在这种情况下为Ok或Close)

1 个答案:

答案 0 :(得分:1)

遗憾的是,页面末尾的zetcode wx.Dialog示例既不聪明也不明智。不要破坏对话框中的对话框。

def OnClose(self, e):
    # self.Destroy()
    self.Close()

之后销毁它,以便您可以事先读出设置。

def options() :
    ff = "PNG"
    app = wx.App(None)
    dlg = dial.OptionsDial(None)
    res = dlg.ShowModal()
    if res == wx.ID_OK :
        if dlg.radio_png.GetValue() == True:
            # Yay it is PNG!
            ff = 'PNG'
        # and so on for other possibilities
    dlg.Destroy() # now it is time to destroy it
    return ff

当然,为了能够读出您的无线电选择,您必须从wx.Dialog实例外部访问RB。

    self.radio_png = wx.RadioButton(pnl, label='PNG', style=wx.RB_GROUP))
    ...
    sbs.Add(self.radio_png)