изменить текст с панели на другую панель в wxpython SplitterWindow - PullRequest
0 голосов
/ 09 октября 2018

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

import wx

import wx.grid as gridlib

класс RegularPanel (wx.Panel):

def __init__(self, parent):

    wx.Panel.__init__(self, parent)

    self.SetBackgroundColour("blue")

    button1 = wx.Button(self, label="change the text")

    self.Bind(wx.EVT_BUTTON, self.OnChange, id=button1.GetId())

def OnChange(self, event):

    value = str(self.text.GetLabel())

    value = "this works"

    self.text.SetLabel(str(value))

классДругая панель (wx.Panel):

def __init__(self, parent):

    wx.Panel.__init__(self, parent)

    self.SetBackgroundColour("white")

    self.text = wx.StaticText(self, -1, 'try to change this text', (40, 60))

класс GridPanel (wx.Panel):

def __init__(self, parent):

    wx.Panel.__init__(self, parent)

    self.grid = gridlib.Grid(self, style=wx.BORDER_SUNKEN)

    self.grid.CreateGrid(20,8)

    sizer = wx.BoxSizer(wx.VERTICAL)

    sizer.Add(self.grid, 1, wx.EXPAND)

    self.SetSizer(sizer)

класс MainPanel (wx.Panel):

def __init__(self, parent):

    wx.Panel.__init__(self, parent)

    notebook = wx.Notebook(self)

    page = wx.SplitterWindow(notebook)

    notebook.AddPage(page, "Splitter")

    hSplitter = wx.SplitterWindow(page)

    panelOne = OtherPanel(hSplitter)

    panelTwo = GridPanel(hSplitter)

    hSplitter.SplitVertically(panelOne, panelTwo)

    hSplitter.SetSashGravity(0.5)

    panelThree = RegularPanel(page)

    page.SplitHorizontally(hSplitter, panelThree)

    page.SetSashGravity(0.5)

    sizer = wx.BoxSizer(wx.VERTICAL)

    sizer.Add(notebook, 1, wx.EXPAND)

    self.SetSizer(sizer)

класс MainFrame (wx.Frame):

def __init__(self):

    wx.Frame.__init__(self, None, title="Nested Splitters",
                      size=(800,600))
    panel = MainPanel(self)
    self.Show()

, если name == " main ":

app = wx.App(False)

frame = MainFrame()

app.MainLoop()

1 Ответ

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

Проблема в том, что RegularPanel не имеет ссылки (то есть не знает) на self.text, как это было создано и живет в OtherPanel.

Есть несколько подходов, чтобы сделатьэта работа.В данном случае проще всего было бы просто передать экземпляр OtherPanel в RegularPanel при его создании.Затем вы можете получить ссылку на другую панель и получить доступ к ее виджетам.

Вот ваш код с этой модификацией:

import wx

import wx.grid as gridlib

class RegularPanel(wx.Panel):

    def __init__(self, parent, other_panel):  # <-- New argument added

        wx.Panel.__init__(self, parent)
        frame = wx.GetTopLevelParent(self) 
        self.other_panel = other_panel # <-- Create a reference to other panel
        self.SetBackgroundColour("blue")
        button1 = wx.Button(self, label="change the text")
        self.Bind(wx.EVT_BUTTON, self.OnChange, id=button1.GetId())

    def OnChange(self, event):
        value = str(self.other_panel.text.GetLabel())  # <-- Use other panel to set text
        value = "this works"
        self.other_panel.text.SetLabel(str(value))


class OtherPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("white")
        self.text = wx.StaticText(self, -1, 'try to change this text', (40, 60))

class GridPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.grid = gridlib.Grid(self, style=wx.BORDER_SUNKEN)
        self.grid.CreateGrid(20,8)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.grid, 1, wx.EXPAND)
        self.SetSizer(sizer)


class MainPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        notebook = wx.Notebook(self)
        page = wx.SplitterWindow(notebook)
        notebook.AddPage(page, "Splitter")
        hSplitter = wx.SplitterWindow(page)
        panelOne = OtherPanel(hSplitter)
        panelTwo = GridPanel(hSplitter)
        hSplitter.SplitVertically(panelOne, panelTwo)
        hSplitter.SetSashGravity(0.5)
        panelThree = RegularPanel(page, panelOne)  # <-- Pass in other panel reference
        page.SplitHorizontally(hSplitter, panelThree)
        page.SetSashGravity(0.5)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.EXPAND)
        self.SetSizer(sizer)


class MainFrame(wx.Frame):

    def __init__(self):

        wx.Frame.__init__(self, None, title="Nested Splitters",
                          size=(800,600))
        self.panel = MainPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Вы также можете использовать PubSub, чтобы делать подобные вещи.Если вы заинтересованы в таком подходе, вы можете проверить следующие ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...