Я хочу передать переменную между классами GUI. Ниже, когда я показываю Other_b class , он показывает фрейм, но я не могу получить данные Main1 class туда. Однако когда я пытаюсь показать класс 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()
1
gcs 29 Май 2019 в 14:39

2 ответа

Лучший ответ

Вы очень близки!
Несколько разумных вариантов использования 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)
1
Rolf of Saxony 29 Май 2019 в 12:36

Я немного упорядочил ваш код, так что теперь он передает переменную из класса Main1 в классы Other.

Основная проблема в том, что вы вообще не передаете переменные. Строка a=Other_a(self).Show() в вашем коде фактически передает весь frame классу Other_a. Если вы хотите передать значения x и y, вы можете указать список [self.x, self.y] в качестве значения foo для Other_a.

Затем в экземпляре a класса Other_a вам нужна строка типа self.foo = foo. Почему? Потому что вы хотите использовать значение foo вне метода __init__.

То же самое происходит с b и Other_b.

Посмотрите здесь и здесь для получения дополнительной информации о том, как работает clasess в 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
kbr85 29 Май 2019 в 12:43