вызов Frame2 с кнопки в Frame1

#python #button #wxpython #frame

#python #кнопка #wxpython #фрейм

Вопрос:

Я новичок в python, я должен вызвать фрейм «Frame2», когда я нажимаю на кнопку из Frame1, у меня возникает эта ошибка:

введите описание изображения здесь

это мой код:

 global Frame2 fr
 def OnButton4Button(self, event):

        fr.Show()
        even.Skip()
 

ПРИМЕЧАНИЕ: я работаю с wxpython и конструктором boa
, спасибо за помощь

Комментарии:

1. вы видели, что у вас есть опечатка отступа между двумя первыми строками, которые должны быть выровнены по одному столбцу

2. и, пожалуйста, примените рекомендации PEP8

Ответ №1:

В вашем коде есть несколько опечаток. Вот исправленный пример:

 from Frame2 import fr
def OnButton4Button(self, event):
    fr.Show()
    event.Skip()  # you need to spell event correctly
 

Предполагается, что Frame2 является модулем. В большинстве случаев вам не нужно использовать глобальные переменные в Python.

Чтобы сделать это немного проще, я написал пример, в котором есть класс мэйнфрейма и класс Frame2 в одном модуле, поэтому вам не нужно ничего импортировать или использовать глобальные переменные:

 import wx

########################################################################
class Frame2(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Frame2")
        panel = wx.Panel(self)



########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Main Frame")
        panel = wx.Panel(self)

        button = wx.Button(panel, label="Open Frame2")
        button.Bind(wx.EVT_BUTTON, self.onButton)
        self.Show()

    #----------------------------------------------------------------------
    def onButton(self, event):
        """"""
        frame = Frame2()
        frame.Show()
        event.Skip()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()
 

Ответ №2:

В вашем коротком коде у вас есть отступ во второй строке, это ошибка, вы должны написать это как:

 from Frame2 import fr
def OnButton4Button(self, event):

        fr.Show()
        event.Skip()
 

Вы можете соблюдать отступы в Python, как в следующем примере:

 global var
def function():
    #indented block
    #should be always on the same column
    condition = 1
    if condition:
        #new indented block
        #is also aligned on a column
        print "something"
    #this is out of the IF block
#call the function
function()
 

В рекомендациях PEP8 вы найдете правила, позволяющие избежать ошибок отступов.

Комментарии:

1. спасибо daouzli, но у меня все еще есть эта проблема в глобальном Frame2 fr: (

2. действительно, global Frame2 fr недопустимо в Python. Если целью является определение 2 глобальных переменных, это должно быть записано global Frame2, fr .

3. но если Frame2 является модулем, а fr — элементом модуля, вы можете импортировать fr из своего модуля следующим образом: from Frame2 import fr