从pygame应用程序调用wx对话框并返回值

2024-04-23 08:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从我的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)


Tags: selfaddclosepngdef按钮label对话框
1条回答
网友
1楼 · 发布于 2024-04-23 08:34:47

遗憾的是,页面末尾的zetcodewx.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

当然,为了能够读出您的无线电选择,您必须使RBs可以从wx.Dialog实例外部访问。你知道吗

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

相关问题 更多 >