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

问题描述

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

import wx,wx.media
filePathList = ["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,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)

这有点难看,因为父母创造了孩子 孩子们必须知道父母的结构 同时。

可能最 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,media):
        self.mediaFilePath = media

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...