【问题标题】:wxpython: detect whether a dialog has been closedwxpython:检测对话框是否已关闭
【发布时间】:2017-01-24 14:56:50
【问题描述】:

我正在使用 wxpython 创建一个 GUI,并且我有以下自定义对话框类:

class GetDataDlg(wx.Dialog):

    def __init__(self, *args, **kwargs):
        self.parameters = kwargs.pop('parameters', None)
        request = kwargs.pop('request', None)
        assert self.parameters is not None
        assert request is not None
        strings = re.findall('[A-Z][a-z]*', request)
        info = ""
        for string in strings:
            if len(string) == 1:
                info = info + string
            elif not info:
                info = string.lower()
            else:
                info = info + " " + string.lower()

        wx.Dialog.__init__(self, *args, **kwargs)

        self.data = {}

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        input_text = wx.StaticText(self, label="Please type the new {}".format(info))
        main_sizer.Add(input_text, 1, wx.ALL, 10)
        input_sizer = wx.BoxSizer(wx.HORIZONTAL)
        main_sizer.Add(input_sizer, 1, wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, 10)
        text_sizer = wx.BoxSizer(wx.VERTICAL)
        input_sizer.Add(text_sizer, 1, wx.ALIGN_LEFT | wx.RIGHT, 10)
        ctrl_sizer = wx.BoxSizer(wx.VERTICAL)
        input_sizer.Add(ctrl_sizer, 1, wx.ALIGN_RIGHT)
        self.controls = controls = {}

        for key in self.parameters:
            text = wx.StaticText(self, label=key)
            text_sizer.Add(text, 0, wx.BOTTOM, 17)
            ctrl = controls[key] = wx.TextCtrl(self)
            ctrl_sizer.Add(ctrl, 0, wx.BOTTOM, 10)
        ok_button = wx.Button(self, id=wx.ID_OK)
        main_sizer.Add(ok_button, 1, wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
        self.SetSizer(main_sizer)
        self.Fit()
        self.Layout()

        ok_button.Bind(wx.EVT_BUTTON, self.save_data)

    def save_data(self, event):
        for item in self.parameters:
            self.data[item] = self.controls[item].GetValue()
        event.Skip()

在我的主框架中,我这样调用对话框:

dlg = GetDataDlg(self, parameters=parameter, request=item)
result = dlg.ShowModal()

现在我需要检测用户是否按下了我的代码提供的确定按钮或类本身提供的对话框右上方的关闭按钮。 result 在这两种情况下似乎没有变化,dlg 的其他属性也没有变化。此外,我无法检查dlg.data 的存在,因为即使按下关闭按钮,对话框也会显示保存值。

有人有什么想法吗?

【问题讨论】:

  • 这很奇怪。当使用按钮关闭对话框时, ShowModal 应返回其 ID(在您的情况下为 wx.ID_OK)。当我关闭对话框时,我得到 wx.ID_CANCEL。你从 ShowModal 得到的实际价值是多少?
  • @PetrBlahos 感谢您的回答。我在调试器中得到 result = {int} 5100 。我是否错误地可视化了 id?
  • ID_OK 是 5100,ID_CANCEL 是 5101。奇怪的是,当你关闭对话框时,你会得到 ID_OK。你在哪个平台,wx 版本?
  • 我在 Windows 上使用 PyCharm Community Edition 2016.1.4。 wxPython版本为3.0.3.dev2487+3b86464,Python解释器版本为3.4.4。
  • 尝试将OK按钮的id改为ID_CANCEL,看看按下按钮和关闭对话框是否有区别。

标签: python user-interface dialog modal-dialog wxpython


【解决方案1】:

您没有绑定关闭事件。
您是否尝试过在 OnQuit 返回 wx.ID_CANCEL 的位置插入 self.Bind(wx.EVT_CLOSE, self.OnQuit)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多