如何用按钮调用另一个 class 并在 class 之间传递变量?
How to call another class with button and pass variable between classes?
我想在 GUI classes 之间传递变量。下面,当我显示 Other_b class 时,它显示框架但我无法获得 Main1 class' 数据到那里。然而,当我尝试显示 Other_a class 时,它传递了 x 值(因为它在 __init__) 但它没有传递 y 值,因为它与 Btn2 有关(当然是因为没有任何框架来按下按钮)。
我该如何克服这个问题?任何帮助将不胜感激。
import wx
class Main1 (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.Btn1 = wx.Button( self, wx.ID_ANY, u"Btn1", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer1.Add( self.Btn1, 1, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer1 )
self.Btn1.Bind( wx.EVT_BUTTON, self.btn1_f )
def btn1_f( self, event ):
print("here 1")
self.x = 12
self.y = 30
a=Other_a(self).Show()
b=Other_b(self).Show()
class Other_a (wx.Frame):
def __init__(self, foo):
wx.Frame.__init__ ( self )
self.bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer2.Add( self.Btn2, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer2 )
self.Btn2.Bind( wx.EVT_BUTTON, self.btn2_f )
print("here 2")
print(foo.x)
def btn2_f(self,foo):
print("here 3")
print(foo.y)
class Other_b (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer3.Add( self.Btn3, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer3 )
self.Btn3.Bind( wx.EVT_BUTTON, self.btn3_f )
print("here 4")
def btn3_f(self,event):
print("here 5")
print(self.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()
你们很亲近!
明智地使用 self
和 parent
可以解决您的问题。
import wx
class Main1 (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.Btn1 = wx.Button( self, wx.ID_ANY, u"Btn1", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer1.Add( self.Btn1, 1, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer1 )
self.Btn1.Bind( wx.EVT_BUTTON, self.btn1_f )
def btn1_f( self, event ):
print("here 1")
self.x = 12
self.y = 30
a=Other_a(parent=self).Show()
b=Other_b(parent=self).Show()
class Other_a (wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ (self,parent)
self.parent = parent
self.bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn A 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer2.Add( self.Btn2, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer2 )
self.Btn2.Bind( wx.EVT_BUTTON, self.btn2_f )
print("here 2")
print(self.parent.x)
def btn2_f(self,foo):
print("here 3")
print(self.parent.y)
class Other_b (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.parent = parent
self.bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn B 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer3.Add( self.Btn3, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer3 )
self.Btn3.Bind( wx.EVT_BUTTON, self.btn3_f )
print("here 4")
def btn3_f(self,event):
print("here 5")
print(self.parent.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()
给出:
python 20190529.py
here 1
here 2
12
here 4
here 3
30
here 5
12
这是您的代码与上面代码之间的diff
:
< a=Other_a(self).Show()
< b=Other_b(self).Show()
---
> a=Other_a(parent=self).Show()
> b=Other_b(parent=self).Show()
23,24c23,25
< def __init__(self, foo):
< wx.Frame.__init__ ( self )
---
> def __init__(self, parent):
> wx.Frame.__init__ (self,parent)
> self.parent = parent
26c27
< self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
---
> self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn A 2", wx.DefaultPosition, wx.DefaultSize, 0 )
32c33
< print(foo.x)
---
> print(self.parent.x)
36c37
< print(foo.y)
---
> print(self.parent.y)
40a42
> self.parent = parent
42c44
< self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
---
> self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn B 2", wx.DefaultPosition, wx.DefaultSize, 0 )
50c52
< print(self.x)
---
> print(self.parent.x)
我稍微安排了你的代码,所以现在它将变量从 Main1 class 传递到 Other classes。
主要问题是您根本没有传递变量。您代码中的行 a=Other_a(self).Show()
实际上是将整个 frame
提供给 Other_a
class。如果你想传递 x
和 y
值,那么你可以给出一个列表 [self.x, self.y]
作为 Other_a
的 foo
值。
然后,在 class Other_a
的实例 a
中,您需要像 self.foo = foo
这样的行。为什么?因为你想在 __init__
方法之外使用 foo
的值。
b
和 Other_b
也是如此。
查看 here and here 了解有关类在 Python 中如何工作的更多详细信息。
import wx
class Main1(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent=parent)
self.bSizer1 = wx.BoxSizer(wx.VERTICAL)
self.Btn1 = wx.Button(self, wx.ID_ANY, "Btn1", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer1.Add(self.Btn1, 1, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer1)
self.Btn1.Bind(wx.EVT_BUTTON, self.btn1_f)
def btn1_f(self, event):
print("here 1")
self.x = 12
self.y = 30
a = Other_a([self.x, self.y])
a.Show()
b = Other_b(self.x)
b.Show()
class Other_a(wx.Frame):
def __init__(self, foo):
self.foo = foo
wx.Frame.__init__(self, None)
self.bSizer2 = wx.BoxSizer(wx.VERTICAL)
self.Btn2 = wx.Button(self, wx.ID_ANY, "Btn 2a", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer2.Add(self.Btn2, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer2)
self.Btn2.Bind(wx.EVT_BUTTON, self.btn2_f)
print("here 2")
print(self.foo[0])
def btn2_f(self, event):
print("here 3")
print(self.foo[1])
class Other_b(wx.Frame):
def __init__(self, x):
self.x = x
wx.Frame.__init__(self, None)
self.bSizer3 = wx.BoxSizer(wx.VERTICAL)
self.Btn3 = wx.Button(self, wx.ID_ANY, "Btn 2b", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer3.Add(self.Btn3, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer3)
self.Btn3.Bind(wx.EVT_BUTTON, self.btn3_f)
print("here 4")
def btn3_f(self, event):
print("here 5")
print(self.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()
我想在 GUI classes 之间传递变量。下面,当我显示 Other_b class 时,它显示框架但我无法获得 Main1 class' 数据到那里。然而,当我尝试显示 Other_a class 时,它传递了 x 值(因为它在 __init__) 但它没有传递 y 值,因为它与 Btn2 有关(当然是因为没有任何框架来按下按钮)。
我该如何克服这个问题?任何帮助将不胜感激。
import wx
class Main1 (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.Btn1 = wx.Button( self, wx.ID_ANY, u"Btn1", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer1.Add( self.Btn1, 1, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer1 )
self.Btn1.Bind( wx.EVT_BUTTON, self.btn1_f )
def btn1_f( self, event ):
print("here 1")
self.x = 12
self.y = 30
a=Other_a(self).Show()
b=Other_b(self).Show()
class Other_a (wx.Frame):
def __init__(self, foo):
wx.Frame.__init__ ( self )
self.bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer2.Add( self.Btn2, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer2 )
self.Btn2.Bind( wx.EVT_BUTTON, self.btn2_f )
print("here 2")
print(foo.x)
def btn2_f(self,foo):
print("here 3")
print(foo.y)
class Other_b (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer3.Add( self.Btn3, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer3 )
self.Btn3.Bind( wx.EVT_BUTTON, self.btn3_f )
print("here 4")
def btn3_f(self,event):
print("here 5")
print(self.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()
你们很亲近!
明智地使用 self
和 parent
可以解决您的问题。
import wx
class Main1 (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.Btn1 = wx.Button( self, wx.ID_ANY, u"Btn1", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer1.Add( self.Btn1, 1, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer1 )
self.Btn1.Bind( wx.EVT_BUTTON, self.btn1_f )
def btn1_f( self, event ):
print("here 1")
self.x = 12
self.y = 30
a=Other_a(parent=self).Show()
b=Other_b(parent=self).Show()
class Other_a (wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ (self,parent)
self.parent = parent
self.bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn A 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer2.Add( self.Btn2, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer2 )
self.Btn2.Bind( wx.EVT_BUTTON, self.btn2_f )
print("here 2")
print(self.parent.x)
def btn2_f(self,foo):
print("here 3")
print(self.parent.y)
class Other_b (wx.Frame):
def __init__(self,parent):
wx.Frame.__init__ ( self, parent )
self.parent = parent
self.bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn B 2", wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer3.Add( self.Btn3, 0, wx.ALL|wx.EXPAND, 5 )
self.SetSizer( self.bSizer3 )
self.Btn3.Bind( wx.EVT_BUTTON, self.btn3_f )
print("here 4")
def btn3_f(self,event):
print("here 5")
print(self.parent.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()
给出:
python 20190529.py
here 1
here 2
12
here 4
here 3
30
here 5
12
这是您的代码与上面代码之间的diff
:
< a=Other_a(self).Show()
< b=Other_b(self).Show()
---
> a=Other_a(parent=self).Show()
> b=Other_b(parent=self).Show()
23,24c23,25
< def __init__(self, foo):
< wx.Frame.__init__ ( self )
---
> def __init__(self, parent):
> wx.Frame.__init__ (self,parent)
> self.parent = parent
26c27
< self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
---
> self.Btn2 = wx.Button( self, wx.ID_ANY, u"Btn A 2", wx.DefaultPosition, wx.DefaultSize, 0 )
32c33
< print(foo.x)
---
> print(self.parent.x)
36c37
< print(foo.y)
---
> print(self.parent.y)
40a42
> self.parent = parent
42c44
< self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn 2", wx.DefaultPosition, wx.DefaultSize, 0 )
---
> self.Btn3 = wx.Button( self, wx.ID_ANY, u"Btn B 2", wx.DefaultPosition, wx.DefaultSize, 0 )
50c52
< print(self.x)
---
> print(self.parent.x)
我稍微安排了你的代码,所以现在它将变量从 Main1 class 传递到 Other classes。
主要问题是您根本没有传递变量。您代码中的行 a=Other_a(self).Show()
实际上是将整个 frame
提供给 Other_a
class。如果你想传递 x
和 y
值,那么你可以给出一个列表 [self.x, self.y]
作为 Other_a
的 foo
值。
然后,在 class Other_a
的实例 a
中,您需要像 self.foo = foo
这样的行。为什么?因为你想在 __init__
方法之外使用 foo
的值。
b
和 Other_b
也是如此。
查看 here and here 了解有关类在 Python 中如何工作的更多详细信息。
import wx
class Main1(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent=parent)
self.bSizer1 = wx.BoxSizer(wx.VERTICAL)
self.Btn1 = wx.Button(self, wx.ID_ANY, "Btn1", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer1.Add(self.Btn1, 1, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer1)
self.Btn1.Bind(wx.EVT_BUTTON, self.btn1_f)
def btn1_f(self, event):
print("here 1")
self.x = 12
self.y = 30
a = Other_a([self.x, self.y])
a.Show()
b = Other_b(self.x)
b.Show()
class Other_a(wx.Frame):
def __init__(self, foo):
self.foo = foo
wx.Frame.__init__(self, None)
self.bSizer2 = wx.BoxSizer(wx.VERTICAL)
self.Btn2 = wx.Button(self, wx.ID_ANY, "Btn 2a", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer2.Add(self.Btn2, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer2)
self.Btn2.Bind(wx.EVT_BUTTON, self.btn2_f)
print("here 2")
print(self.foo[0])
def btn2_f(self, event):
print("here 3")
print(self.foo[1])
class Other_b(wx.Frame):
def __init__(self, x):
self.x = x
wx.Frame.__init__(self, None)
self.bSizer3 = wx.BoxSizer(wx.VERTICAL)
self.Btn3 = wx.Button(self, wx.ID_ANY, "Btn 2b", wx.DefaultPosition, wx.DefaultSize, 0)
self.bSizer3.Add(self.Btn3, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(self.bSizer3)
self.Btn3.Bind(wx.EVT_BUTTON, self.btn3_f)
print("here 4")
def btn3_f(self, event):
print("here 5")
print(self.x)
if __name__ == "__main__":
app = wx.App(False)
frame = Main1(None)
frame.Show(True)
app.MainLoop()