如何使用按钮调用另一个类并在类之间传递变量?

时间:2019-05-29 11:39:42

标签: python class wxpython share

我想在GUI类之间传递变量。在下面,当我显示 Other_b类时,它显示了框架,但我无法在那里获取 Main1类的数据。但是,当我尝试显示 Other_a类时,它传递了 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()

2 个答案:

答案 0 :(得分:2)

我稍微整理一下代码,现在将其从Main1类传递到Other类。

主要问题是您根本没有传递变量。您的代码中的行a=Other_a(self).Show()实际上是将整个frame赋予Other_a类。如果要传递xy值,则可以提供列表[self.x, self.y]作为foo的{​​{1}}值。

然后,在类Other_a的实例a中,您需要像Other_a这样的行。为什么?因为您想在self.foo = foo方法之外使用foo的值。

__init__b也会发生同样的情况。

看看herehere,了解有关clases在Python中的工作方式的详细信息。

Other_b

答案 1 :(得分:1)

您非常亲密!
明智地使用selfparent可以解决您的问题。

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)