【问题标题】:WXPython, passing variable from left to right panelWXPython,从左到右面板传递变量
【发布时间】:2021-01-18 15:53:46
【问题描述】:

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

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.left_panelself.right_panel,然后使用sizer 来组织它们。面向对象编程并不总是答案,例如,当你只有一把锤子时,一切看起来都像钉子。

标签: python attributes wxpython definition


【解决方案1】:

如果您想快速解决问题,只需致电:

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

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

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

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

【讨论】:

    【解决方案2】:

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

        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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2011-10-02
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      相关资源
      最近更新 更多