Я думаю, что это ниже находится на одном уровне, чем вопрос, который Вы задаете, но если Вы действительно хотите, чтобы электронное письмо HTML было правильно просмотрено как можно большим количеством клиентов, удостоверьтесь, что он использует допустимый MIME. В частности, для электронного письма, которое рассмотрят как допустимый MIME, ДОЛЖНЫ заголовки (в значении слова RFC), содержат оба из этих заголовков:
MIME-Version:
Content-Type:
Очень строгие клиенты отобразят Ваш HTML как необработанный текст, если один или другие из них будет отсутствовать. Вы были бы удивлены, сколько крупных поставщиков онлайн, которые должны знать лучше, завинтило это (особенно, я получил электронные письма HTML w/недостающая Версия MIME: заголовки от Amazon и ACM в прошлом)
What about wxGauge which displays a horizontal or vertical bar?
http://www.wxpython.org/docs/api/wx.Gauge-class.html
More complete C++ doc: http://docs.wxwidgets.org/2.6/wx_wxgauge.html#wxgauge
Вы всегда можете создать свою собственную производную от wx.Dialog и, используя sizer, добавить в нужные вам виджеты.
Вот один из моих виджетов, например:
class ProgressDialog(wx.Dialog):
"""
Shows a Progres Gauge while an operation is taking place. May be cancellable
which is possible when converting pdf/ps
"""
def __init__(self, gui, title, to_add=1, cancellable=False):
"""Defines a gauge and a timer which updates the gauge."""
wx.Dialog.__init__(self, gui, title=title,
style=wx.CAPTION)
self.gui = gui
self.count = 0
self.to_add = to_add
self.timer = wx.Timer(self)
self.gauge = wx.Gauge(self, range=100, size=(180, 30))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.gauge, 0, wx.ALL, 10)
if cancellable:
cancel = wx.Button(self, wx.ID_CANCEL, _("&Cancel"))
cancel.SetDefault()
cancel.Bind(wx.EVT_BUTTON, self.on_cancel)
btnSizer = wx.StdDialogButtonSizer()
btnSizer.AddButton(cancel)
btnSizer.Realize()
sizer.Add(btnSizer, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 10)
self.SetSizer(sizer)
sizer.Fit(self)
self.SetFocus()
self.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
self.timer.Start(30)
def on_timer(self, event):
"""Increases the gauge's progress."""
self.count += self.to_add
self.gauge.SetValue(self.count)
if self.count > 100:
self.count = 0
def on_cancel(self, event):
"""Cancels the conversion process"""
# do whatever