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
我正在编写一个程序,当在选择要播放的内容后按下左侧面板上的按钮时,会在右侧面板上播放视频。这充当向用户展示的测试功能。我是使用 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