0

1 つ質問があります..ノートブックの wxPython listctrl

2タブ使いノートを作成しました。

最初のタブにボタンを追加し、2 番目のタブに Listctrl を追加しました。

ボタンをクリックすると、Listctrl の値を 2 番目のタブに追加します。この問題を解決するには?

import wx

class PageOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.query_find_btn = wx.Button(self, 4, "BTN", (40,40))
        self.Bind(wx.EVT_BUTTON, self.AddList, id = 4)

    def AddList(self, evt):
        self.list1.InsertStringItem(0,'Hello')

class PageTwo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.list1 = wx.ListCtrl(self,-1,wx.Point(0,0),wx.Size(400,400),style=wx.LC_REPORT |   wx.SUNKEN_BORDER)
    self.list1.InsertColumn(0,'values')

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self,parent,id,title,size=(400,400),pos=wx.Point(100,100), 
        style=wx.SYSTEM_MENU |wx.CAPTION )

        p = wx.Panel(self)
        nb = wx.Notebook(p)

        MainFrame = PageOne(nb)
        SecondFrame = PageTwo(nb)

        nb.AddPage(MainFrame, "One")
        nb.AddPage(SecondFrame, "Two")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)


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

if __name__ == '__main__':
    app = MyApp(False)
    app.MainLoop()
4

1 に答える 1

0

これにアプローチするには、いくつかの方法があります。次のように、ばかげた方法でそれを行うことができます。

import wx

class PageOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.query_find_btn = wx.Button(self, -1, "BTN", (40,40))
        self.Bind(wx.EVT_BUTTON, self.AddList, self.query_find_btn)

    def AddList(self, evt):
        frame = self.GetTopLevelParent()
        frame.pageTwo.list1.InsertStringItem(0,'Hello')

class PageTwo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.list1 = wx.ListCtrl(self,-1,wx.Point(0,0),wx.Size(400,400),style=wx.LC_REPORT |   wx.SUNKEN_BORDER)
        self.list1.InsertColumn(0,'values')

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self,parent,id,title,size=(400,400),pos=wx.Point(100,100), 
        style=wx.SYSTEM_MENU |wx.CAPTION )

        p = wx.Panel(self)
        nb = wx.Notebook(p)

        self.pageOne = PageOne(nb)
        self.pageTwo = PageTwo(nb)

        nb.AddPage(self.pageOne, "One")
        nb.AddPage(self.pageTwo, "Two")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)


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

if __name__ == '__main__':
    app = MyApp(False)
    app.MainLoop()

または、pubsub を使用することもできます。これは、はるかにクリーンで、壊れる可能性がはるかに低くなります。これを行う1つの方法は次のとおりです。

    import wx
from wx.lib.pubsub import pub 

class PageOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.query_find_btn = wx.Button(self, -1, "BTN", (40,40))
        self.Bind(wx.EVT_BUTTON, self.AddList, self.query_find_btn)

    def AddList(self, evt):
        pub.sendMessage("listctrlListener", message="Hello")

class PageTwo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.list1 = wx.ListCtrl(self,-1,wx.Point(0,0),wx.Size(400,400),style=wx.LC_REPORT |   wx.SUNKEN_BORDER)
        self.list1.InsertColumn(0,'values')
        pub.subscribe(self.updateListCtrl, "listctrlListener")

    #----------------------------------------------------------------------
    def updateListCtrl(self, message):
        """"""
        self.list1.InsertStringItem(0, message)

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self,parent,id,title,size=(400,400),pos=wx.Point(100,100), 
        style=wx.SYSTEM_MENU |wx.CAPTION )

        p = wx.Panel(self)
        nb = wx.Notebook(p)

        MainFrame = PageOne(nb)
        SecondFrame = PageTwo(nb)

        nb.AddPage(MainFrame, "One")
        nb.AddPage(SecondFrame, "Two")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)


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

if __name__ == '__main__':
    app = MyApp(False)
    app.MainLoop()

これは、pubsub の新しい API を使用しています。ここでそれを使用する別の例を見ることができます:

古いバージョンの wxPython (2.8.10 より前) を使用している場合は、おそらく pubsub の古い API を使用する必要があります。これについては、次を参照してください。

ボタンのIDを削除したことにも注意してください。wxPython によって内部的に使用される可能性があるため、ボタンの id を低い数値に設定しないでください。ID を作成する必要がある場合は、次のようにすることをお勧めします。

btnId = wx.NewId()
于 2013-11-04T15:50:19.753 に答える