2014-02-12 3 views
1

Как указано в некоторых других темах, wx.MessageDialog не отвечает на многие функции API, такие как внешний вызов от Destroy() и т. Д. Таким образом, существует необходимость в создании wx.GenericMessageBox, полученных из wx.Dialog. Вот оно:Общее сообщение MessageBox, полученное из wx.Dialog

enter image description here

import wx 

class GenericMessageBox(wx.Dialog): 
    def __init__(self, parent, text, title = ''): 
     wx.Dialog.__init__(self, parent, -1, title = title, size = (360,120), style = wx.DEFAULT_DIALOG_STYLE) 
     panel = wx.Panel(self, wx.ID_ANY, size = (360, 50), pos = (0,0)) 
     panel.SetBackgroundColour('#FFFFFF') 
     label = wx.StaticText(panel, -1, text, pos = (50,20))   
     panel2 = wx.Panel(self, wx.ID_ANY, size = (360, 40), pos = (0, 50)) 
     btn = wx.Button(panel2, wx.ID_OK, pos = (250,7)) 
     self.ShowModal() 


app = wx.App() 
frame = wx.Frame(None, 0, 'Test') 
frame.Show() 
GenericMessageBox(frame, 'This is a message box that is derived from wx.Dialog. You can Destroy() it from anywhere in the code.', 'Test') 
app.MainLoop() 

В отличие от wx.lib.agw.genericmessagedialog, цель этого одного является иметь ближе взглянуть можно родной вид ОС (здесь Windows, взгляд). [genericmessagedialog размещены фото в кнопки, которая не является, как родной внешний вид Windows']

Как бы это было возможно улучшить этот диалог с тем, что его размер автоматически увеличивается, если StaticText нужны две строки?

Кроме того, позиционирование ОК (x, y) в порядке и по центру на серой панели на моей машине, но будет ли оно одинаковым на других платформах?

(я думаю, что такой фрагмент может быть полезным для сообщества.)

ответ

1

Для управления макета, то лучше использовать Sizer вместо позиции.

Вы можете попробовать с помощью следующего кода:

использование self.setMessageLine (Num) для установки выхода, чтобы увидеть разницу.

import wx 

    class MyDialog (wx.Dialog): 

     def __init__(self, parent): 
      wx.Dialog.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(300,200), style = wx.DEFAULT_DIALOG_STYLE) 

      #set the minimum Size of the frame to Fit() 
      self.SetSizeHintsSz(wx.Size(300,-1), wx.DefaultSize) 

      fgSizer = wx.FlexGridSizer(2, 1, 0, 0) 
      fgSizer.AddGrowableCol(0) 
      fgSizer.AddGrowableRow(0) 
      fgSizer.SetFlexibleDirection(wx.BOTH) 
      fgSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_ALL) 

      self.m_panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER|wx.TAB_TRAVERSAL) 
      gSizer = wx.GridSizer(1, 1, 0, 0) 

      self.m_staticText = wx.StaticText(self.m_panel, wx.ID_ANY, u"test", wx.DefaultPosition, wx.DefaultSize, 0) 
      self.m_staticText.Wrap(10) 
      gSizer.Add(self.m_staticText, 0, wx.ALIGN_CENTER|wx.ALL, 5) 


      self.m_panel.SetSizer(gSizer) 
      self.m_panel.Layout() 
      gSizer.Fit(self.m_panel) 
      fgSizer.Add(self.m_panel, 1, wx.EXPAND |wx.ALL, 5) 

      m_sdbSizer = wx.StdDialogButtonSizer() 
      self.m_sdbSizerOK = wx.Button(self, wx.ID_OK) 
      m_sdbSizer.AddButton(self.m_sdbSizerOK) 
      self.m_sdbSizerCancel = wx.Button(self, wx.ID_CANCEL) 
      m_sdbSizer.AddButton(self.m_sdbSizerCancel) 
      m_sdbSizer.Realize() 

      fgSizer.Add(m_sdbSizer, 1, wx.ALL|wx.EXPAND, 5) 
      self.SetSizer(fgSizer) 
      self.Layout() 
      self.Centre(wx.BOTH) 
      self.setMessageLine(10) 

     def setMessageLine(self, messageLine): 
      msg = "" 
      for i in range(0, messageLine): 
       msg += "Line %d \n" % i 

      self.m_staticText.SetLabel(msg) 
      self.Fit() 

    if __name__ == '__main__': 
     app = wx.App() 
     dlg = MyDialog(None) 
     dlg.ShowModal() 
     app.MainLoop() 
     pass 

enter image description here enter image description here

+0

Спасибо большое. Можно ли установить максимальную ширину для 'wx.StaticText', чтобы при автоматическом разбиении на абзац нескольких строк текста было слишком много? – Basj

+1

@Basj Да, попробуйте ** self.m_staticText.Wrap (SIZE) ** –

Смежные вопросы