【问题标题】:How to call another class with button and pass variable between classes?如何用按钮调用另一个类并在类之间传递变量?
【发布时间】:2019-10-15 00:26:54
【问题描述】:

我想在 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()

【问题讨论】:

    标签: python class wxpython share


    【解决方案1】:

    我稍微整理了您的代码,所以现在它将变量从 Main1 类传递到 Other 类。

    主要问题是您根本没有传递变量。代码中的a=Other_a(self).Show() 行实际上是将整个frame 提供给Other_a 类。如果您想传递xy 值,那么您可以提供一个列表[self.x, self.y] 作为fooOther_a 值。

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

    bOther_b 也是如此。

    查看herehere,了解有关 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()
    

    【讨论】:

    • 我希望我也能接受这个答案。我优先考虑时间。非常感谢,它也有效。
    • 并没有阻止我投票 :)
    【解决方案2】:

    你很亲密!
    明智地使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      相关资源
      最近更新 更多