WXPython,将变量从左面板传递到右面板

WXPython, passing variable from left to right panel

我正在编写一个程序,当在选择要播放的内容后按下左侧面板上的按钮时,会在右侧面板上播放视频。这充当向用户展示的测试功能。我是使用 Python 和 WXPython 的初学者。边走边学。 我在下面添加了一段代码:

import wx, wx.media
filePathList = ["None", "None", "None", "None", "None"]

class FrameClass (wx.Frame):
   def __init__(self, parent):
      super(FrameClass, self).__init__(None, title = "Super Bot", size = (750, 400))

      vsplitter = wx.SplitterWindow(self)
      left = LeftPanel(vsplitter, self)
      self.right = RightPanel(vsplitter, self)
      vsplitter.SplitVertically(left, self.right)
      vsplitter.SetMinimumPaneSize(200)
      self.Show(True)

class LeftPanel (wx.Panel):
   def __init__(self, parent, *args, **kwargs):
     wx.Panel.__init__(self, parent = parent)
     testBtn1 = wx.Button(self, -1, "Test", pos = (5, 20))
     self.Bind(wx.EVT_BUTTON, self.buttonPressed1, testBtn1)

   def buttonPressed1(self, event):
     file0 = filePathList[0]
     self.right.onTestClick(file0)


class RightPanel (wx.Panel):
   def __init__(self, parent, media):
     wx.Panel.__init__(self, parent = parent)
     self.mediaFilePath = media

   def onTestClick(self):
     self.testMedia = wx.media.MediaCtrl(self, size = (500, 300), style=wx.SIMPLE_BORDER, szBackend = wx.media.MEDIABACKEND_WMP10)
     self.testMedia.Bind(wx.media.EVT_MEDIA_LOADED, self.play)
     self.testMedia.Load(self.mediaFilePath)

   def play(self, event):
     self.testMedia.Play()

目前一切正常。除了将视频传递到 rightPanel 视频 onTestClick 之外还有什么。哪里显示当前错误

 Traceback (most recent call last):
 File "frame1.py", line 151, in buttonPressed1
 self.right.onTestClick(file0)
 AttributeError: 'LeftPanel' object has no attribute 'right'

我可以想象,因为 right 是在 FrameClass 中定义的,所以在尝试使用它时不知道 LeftPanel 的内部。 任何帮助将不胜感激。

如果你想快速修复,你可以拨打:

self.GetParent().right.onTestClick(file0)

这是 kind-of 丑陋的,因为 parent 创建 children children 必须知道 parent 的结构 同时。

可能最 wxPython-ish 的解决方案是创建您的 自己的事件,将在按钮时创建和触发 被按下。该事件将在 FrameClass 中处理。 这里有一个很好的介绍:

https://wxpython.org/Phoenix/docs/html/events_overview.html#custom-event-summary

终于成功了。也感谢您的投入。最有帮助。 我只需要让左面板知道右面板。在这种情况下...

    vsplitter = wx.SplitterWindow(self)
    right = RightPanel(vsplitter, self)
    left = LeftPanel(vsplitter, right)
    vsplitter.SplitVertically(left, right)
    vsplitter.SetMinimumPaneSize(200)

    self.Show(True)



class LeftPanel (wx.Panel):
def __init__(self, parent, top):
    wx.Panel.__init__(self, parent = parent)

    self.refTop = top

当我想发送一些东西时,我引用了“self.refTop”。比如...

def buttonPressed1(self, event):
    file1 = filePathList[0]
    self.refTop.onTestClick(file1)

确保 RightPanel 已准备好参数。

class RightPanel (wx.Panel):
    def __init__(self, parent, media):
        self.mediaFilePath = media