wxPython: Как ссылаться на строку состояния фрейма с отдельных панелей ноутбука? - PullRequest
2 голосов
/ 30 июля 2011

Я уверен, что это легко для вас, ребята, но мне трудно найти решение этой проблемы ...

У меня есть фрейм, который состоит из набора импортированных файлов для создания ноутбука ... что-то вроде:

class myFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, "My Frame", size=(520,635))
        panel = wx.Panel(self)

        notebook = myFrameNotebook(panel)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)

        self.CreateStatusBar(style=0)
        self.SetStatusText("Welcome to My Frame...")

        self.Layout()

        self.Show()
        self.Centre()

Я бы хотел, чтобы на отдельных страницах записной книжки изменялся текст состояния всего фрейма ... Если вышеупомянутое называется myFile, есть ли способ SetStatusText на отдельной странице записной книжки (которая хранится в отдельном файле?)

Что я хотел бы сделать, например, когда вы переходите со страницы записной книжки на страницу записной книжки, строка состояния отображает, где внутри приложения вы находитесь ...?

Большое спасибо,

Чау (все еще новичок в wxPython)

Ответы [ 2 ]

5 голосов
/ 31 июля 2011

Лучше всего использовать для этого PubSub, чтобы отделить зависимости вашего класса от другого (и уменьшить этот шум GetParent (). GetParent () :))

import random, string
import wx

from wx.lib.pubsub import Publisher

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(300, 300))
        self.CreateStatusBar(style=0)
        self.notebook = wx.Notebook(self)
        btn = wx.Button(self, label="add page")
        btn.Bind(wx.EVT_BUTTON, lambda evt: self.create_page(random.choice(string.letters)))

        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(btn, 0)
        box.Add(self.notebook, 1, wx.EXPAND)
        self.SetSizer(box)

        Publisher().subscribe(self.change_statusbar, 'change_statusbar')
        self.create_page("1")
        self.create_page("2")
        self.Layout()

    def create_page(self, text):
        self.notebook.AddPage(Page(self.notebook, text), text)

    def change_statusbar(self, msg):
        self.SetStatusText(msg.data)


class Page(wx.Panel):
    def __init__(self, parent, text):
        wx.Panel.__init__(self, parent)
        Publisher().sendMessage(('change_statusbar'), text)


app = wx.App(redirect=False)
top = Frame()
top.Show()
app.MainLoop()
0 голосов
/ 30 июля 2011

Попробуйте что-то вроде этого (не очень знаком с Python, но это то, что я бы сделал в C ++). В вашем конструкторе:

self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)

Напишите новый метод в вашем классе Frame:

def OnPageChanged(self, event):
    selected_page = event.GetSelection()
    if selected_page == wx.NOT_FOUND:
        self.SetStatusText("No page selected!")
    else:
        self.SetStatusText("Welcome to notebook page: " + event.GetEventObject().GetPageText(selected_page)

У меня не установлен wxPython, так что это не проверено, но это общая идея. Это установит в строке состояния отображение заголовка любой выбранной страницы. Если вам нужно показать некоторые другие данные, которые хранятся на странице, вы, вероятно, можете воспользоваться динамичностью Python и просто добавить свойство для каждой страницы:

def OnLoadPages(self):
    # Read pages from a file
    # Every time you add a page, do this:
    page.status_bar_info = whatever_you_want_to_put_here
def OnPageChanged(self, event):
    # Basically the same as above
    # Instead of calling GetPageText, do this:
    self.SetStatusText(event.GetEventObject().GetCurrentPage().status_bar_info)
...