Окно добавления и всплывающего сообщения wxPython внутри панели, служащее центром уведомлений - PullRequest
0 голосов
/ 16 октября 2018

Я хотел бы создать программу wxpython, в которой есть центр уведомлений, такой же, как в Windows или Mac.Всякий раз, когда у меня есть сообщение, оно будет отображаться на панели уведомлений, и пользователь сможет потом закрыть это сообщение.

У меня есть пример кода для иллюстрации:

import wx
import wx.lib.scrolledpanel as scrolled

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        topPanel = wx.Panel(self)

        panel1 = wx.Panel(topPanel, -1)
        button1 = wx.Button(panel1, -1, label="generate message")

        self.panel2 = scrolled.ScrolledPanel(
            topPanel, -1, style=wx.SIMPLE_BORDER)
        self.panel2.SetAutoLayout(1)
        self.panel2.SetupScrolling()

        button1.Bind(wx.EVT_BUTTON, self.onAdd)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(panel1,-1,wx.EXPAND|wx.ALL,border=10)
        sizer.Add(self.panel2,-1,wx.EXPAND|wx.ALL,border=10)

        self.sizer2 = wx.BoxSizer(wx.VERTICAL)

        topPanel.SetSizer(sizer)
        self.panel2.SetSizer(self.sizer2)

    def onAdd(self, event):
        new_text = wx.TextCtrl(self.panel2, value="New Message")
        self.sizer2.Add(new_text,0,wx.EXPAND|wx.ALL,border=1)
        self.panel2.Layout()
        self.panel2.SetupScrolling()


class MyApp(wx.App):
     def OnInit(self):
         frame = MyFrame(None, -1, 'frame')
         frame.Show(True)
         return True

app = MyApp(0)
app.MainLoop()

В приведенном выше коде I правая панель (т. Е. Panel2) служит центром уведомлений, и все сообщения должны отображаться внутри него.На левой панели (т. Е. Panel1) у меня есть кнопка для создания сообщения, просто чтобы имитировать поведение уведомления.В идеале сообщение на правой панели должно быть окном сообщения, которое вы можете закрыть (может быть, фреймом? Или MessageDialog?)

Любая подсказка или совет очень ценятся, и пример будет лучшим!

Спасибо!

1 Ответ

0 голосов
/ 18 октября 2018

Наконец-то сам разобрался, все оказалось проще, чем я думал.

Вот код:

import wx
import wx.lib.scrolledpanel as scrolled

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        self.number_of_panels = 0

        topPanel = wx.Panel(self)

        panel1 = wx.Panel(topPanel, -1)
        button1 = wx.Button(panel1, -1, label="generate message")

        self.panel2 = scrolled.ScrolledPanel(
            topPanel, -1, style=wx.SIMPLE_BORDER)
        self.panel2.SetAutoLayout(1)
        self.panel2.SetupScrolling()

        button1.Bind(wx.EVT_BUTTON, self.onAdd)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(panel1,0,wx.EXPAND|wx.ALL,border=5)
        sizer.Add(self.panel2,1,wx.EXPAND|wx.ALL,border=5)

        self.sizer2 = wx.BoxSizer(wx.VERTICAL)

        topPanel.SetSizer(sizer)
        self.panel2.SetSizer(self.sizer2)

    def onAdd(self, event):
        self.number_of_panels += 1
        panel_label = "Panel %s" %  self.number_of_panels
        panel_name = "panel%s" % self.number_of_panels

        new_panel = wx.Panel(self.panel2, name=panel_name, style=wx.SIMPLE_BORDER)

        self.closeButton = wx.Button(new_panel, label='Close %s' % self.number_of_panels)
        self.closeButton.panel_number = self.number_of_panels

        self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

        self.sizer2.Add(new_panel,0,wx.EXPAND|wx.ALL,border=1)
        self.panel2.Layout()
        self.panel2.SetupScrolling()

    def OnClose(self, e):

        if self.panel2.GetChildren():
            e.GetEventObject().GetParent().Destroy()
            self.number_of_panels -= 1
            self.panel2.Layout()  # Reset layout after destroy the panel


class MyApp(wx.App):
     def OnInit(self):
         frame = MyFrame(None, -1, 'frame')
         frame.Show(True)
         return True

app = MyApp(0)
app.MainLoop()

По сути, я могу уничтожить только что созданную панель.Мне просто нужно знать, какая это панель, когда я нажимаю кнопку закрытия.Это должно работать очень похоже на Центр уведомлений.

...