Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用wxPython在Windows中使用本机错误图标和错误声音?_Python_Windows_Wxpython - Fatal编程技术网

如何使用wxPython在Windows中使用本机错误图标和错误声音?

如何使用wxPython在Windows中使用本机错误图标和错误声音?,python,windows,wxpython,Python,Windows,Wxpython,这句话很简单: wx.MessageBox('Foo', 'Bar', wx.OK | wx.ICON_ERROR) 给我一个带有错误图标和Windows错误噪声的消息框(这与wx.Bell()的噪声不同)。我想为未捕获的异常创建一个自定义错误对话框,其中可在文本控件等中使用回溯,并且我想包括Windows错误图标和噪波。我知道两个版本的Windows都不同,错误噪音甚至可以自定义 有没有直接的方法可以将这些本机Windows资源与wxPython一起使用?奖金问题;如果答案是否定的,那么做我

这句话很简单:

wx.MessageBox('Foo', 'Bar', wx.OK | wx.ICON_ERROR)
给我一个带有错误图标和Windows错误噪声的消息框(这与
wx.Bell()
的噪声不同)。我想为未捕获的异常创建一个自定义错误对话框,其中可在文本控件等中使用回溯,并且我想包括Windows错误图标和噪波。我知道两个版本的Windows都不同,错误噪音甚至可以自定义

有没有直接的方法可以将这些本机Windows资源与wxPython一起使用?奖金问题;如果答案是否定的,那么做我想做的事情最直接的方式是什么


接受回答后的结果: 我只是想在匿名懦夫的精彩回答后炫耀一下结果,因为它们远远超出了我的预期。这是现在在未处理的异常(在Windows 8上)上弹出的错误对话框:

它还包含现代Windows“UNNK!”错误声音。这是对话框背后的代码。我将其放在一个单独的模块中,该模块在导入时会覆盖
sys.excepthook

"""This module, when imported, overrides the default unhandled exception hook
with one that displays a fancy wxPython error dialog."""

import sys
import textwrap
import traceback
import winsound

import wx

def custom_excepthook(exception_type, value, tb):
    dialog = ExceptionDialog(exception_type, value, tb)
    dialog.ShowModal()

# Override sys.excepthook
sys.excepthook = custom_excepthook

class ExceptionDialog(wx.Dialog):
    """This class displays an error dialog with details information about the
    input exception, including a traceback."""

    def __init__(self, exception_type, exception, tb):
        wx.Dialog.__init__(self, None, -1, title="Unhandled error",
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        self.SetSize((640, 480))
        self.SetMinSize((420, 200))

        self.exception = (exception_type, exception, tb)
        self.initialize_ui()

        winsound.MessageBeep(winsound.MB_ICONHAND)

    def initialize_ui(self):
        extype, exception, tb = self.exception

        panel = wx.Panel(self, -1)

        # Create the top row, containing the error icon and text message.
        top_row_sizer = wx.BoxSizer(wx.HORIZONTAL)

        error_bitmap = wx.ArtProvider.GetBitmap(
            wx.ART_ERROR, wx.ART_MESSAGE_BOX
        )
        error_bitmap_ctrl = wx.StaticBitmap(panel, -1)
        error_bitmap_ctrl.SetBitmap(error_bitmap)

        message_text = textwrap.dedent("""\
            I'm afraid there has been an unhandled error. Please send the
            contents of the text control below to the application's developer.\
        """)
        message_label = wx.StaticText(panel, -1, message_text)

        top_row_sizer.Add(error_bitmap_ctrl, flag=wx.ALL, border=10)
        top_row_sizer.Add(message_label, flag=wx.ALIGN_CENTER_VERTICAL)

        # Create the text control with the error information.
        exception_info_text = textwrap.dedent("""\
            Exception type: {}

            Exception: {}

            Traceback:
            {}\
        """)
        exception_info_text = exception_info_text.format(
            extype, exception, ''.join(traceback.format_tb(tb))
        )

        text_ctrl = wx.TextCtrl(panel, -1,
                                style=wx.TE_MULTILINE | wx.TE_DONTWRAP)
        text_ctrl.SetValue(exception_info_text)

        # Create the OK button in the bottom row.
        ok_button = wx.Button(panel, -1, 'OK')
        self.Bind(wx.EVT_BUTTON, self.on_ok, source=ok_button)
        ok_button.SetFocus()
        ok_button.SetDefault()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(top_row_sizer)
        # sizer.Add(message_label, flag=wx.ALL | wx.EXPAND, border=10)
        sizer.Add(text_ctrl, proportion=1, flag=wx.EXPAND)
        sizer.Add(ok_button, flag=wx.ALIGN_CENTER | wx.ALL, border=5)

        panel.SetSizer(sizer)

    def on_ok(self, event):
        self.Destroy()

我唯一希望得到的改进是,静态文本可以根据对话框的宽度自动流动和包装,但我不想为此而费心创建一个自定义控件类。

wx.MessageBox调用特定于操作系统的标准消息/警报对话框(在windows上,来自user32.dll)。wxWidgets只是将您提供的标志(如wx.OK和wx.ICON_信息)转换为本机消息框的特定于操作系统的标志和选项

您可以通过获取特定于操作系统的图标

就声音而言,只能播放声音文件。但是,如果应用程序不必是可移植的,则可以使用该模块


winsound.MessageBeep(winsound.MB\u ICONHAND)
太完美了!非常感谢。WinXP上的py2.7/wx2.8出现问题;未应用布局。修复:从对话框中删除面板(不需要,因为面板基本上是在模仿对话框)-或者-将面板添加到另一个动态大小调整器中,并将其设置为对话框。WinXP或wx2.8似乎与面板有问题,并且没有正确布局它们。您可能还想将
wx.TE_READONLY
样式添加到wxtxtCtrl和
Center()
对话框中。@AnonymousCoward:谢谢您的反馈。它在我使用wxPython 2.9的系统上运行良好,无需使用额外的面板,但wxPython示例和在线教程通常会添加注释,如“创建面板,以便在所有系统上正确显示布局”。你试过XP上的wxPython 2.9吗?它可以与wx2.9.4一起工作。wx2.8中的wxDialog中的WxPanel似乎存在问题。
import wx
import winsound # windows only

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,wx.ID_ANY)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add( wx.StaticBitmap(self,bitmap=wx.ArtProvider.GetBitmap(wx.ART_INFORMATION)) )
        sizer.Add( wx.StaticBitmap(self,bitmap=wx.ArtProvider.GetBitmap(wx.ART_QUESTION)) )
        sizer.Add( wx.StaticBitmap(self,bitmap=wx.ArtProvider.GetBitmap(wx.ART_WARNING)) )
        sizer.Add( wx.StaticBitmap(self,bitmap=wx.ArtProvider.GetBitmap(wx.ART_ERROR)) )
        self.SetSizerAndFit(sizer)
        self.Show()
        winsound.MessageBeep(winsound.MB_ICONASTERISK)
        winsound.PlaySound('SystemHand', winsound.SND_ASYNC | winsound.SND_ALIAS)

app = wx.PySimpleApp()
Frame()
app.MainLoop()