WxPython GUI编程名称错误:未定义名称“self”

2024-05-04 18:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个程序来编辑一个.txt文件。在

我在一个文件夹中有两个文件:

gui.py & edit_text.py

下面是的代码图形用户界面.py

# -*- coding: utf-8 -*- 
import wx
import wx.xrc

class Main ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Editor MAVB", pos = wx.DefaultPosition, size = wx.Size( 250,180 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.Size( 250,180 ), wx.Size( 250,180 ) )

        layout_sizer = wx.BoxSizer( wx.VERTICAL )

        self.text1 = wx.StaticText( self, wx.ID_ANY, u"Escolha o arquivo que será editado:", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.text1.Wrap( -1 )
        layout_sizer.Add( self.text1, 1, wx.ALL|wx.EXPAND, 5 )

        self.filePicker = wx.FilePickerCtrl( self, wx.ID_ANY, wx.EmptyString, u"Selecione um arquivo", u"*.txt", wx.DefaultPosition, wx.Size( 210,-1 ), wx.FLP_DEFAULT_STYLE|wx.FLP_FILE_MUST_EXIST|wx.FLP_SMALL )
        layout_sizer.Add( self.filePicker, 0, wx.ALL|wx.EXPAND, 5 )

        self.null_text = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        self.null_text.Wrap( -1 )
        layout_sizer.Add( self.null_text, 0, wx.ALL, 5 )

        self.edit_button = wx.Button( self, wx.ID_ANY, u"Alterar arquivo", wx.DefaultPosition, wx.DefaultSize, 0 )
        layout_sizer.Add( self.edit_button, 0, wx.ALL, 5 )

        self.status_text = wx.StaticText( self, wx.ID_ANY, u"Aguardando arquivo...", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.status_text.Wrap( -1 )
        layout_sizer.Add( self.status_text, 0, wx.ALL|wx.EXPAND, 5 )


        self.SetSizer( layout_sizer )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.edit_button.Bind( wx.EVT_BUTTON, self.editar_txt )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def editar_txt( self, event ):
        event.Skip()

下面是编辑的代码_文本.py

^{pr2}$

当我进入程序文件夹并运行编辑_文本.py,我得到了以下错误:

Error in line 
infile = self.filePicker.GetTextCtrlValue()
NameError: name 'self' is not defined
  1. 我在中创建了一个主类图形用户界面.py在
  2. 进口图形用户界面.py编辑成脚本_文本.py在
  3. 从中创建了继承的MyFrame类主图形用户界面班级
  4. 我一打开程序就初始化了MyFrame类
  5. 然后我尝试使用命令获取填充路径:infile = self.filePicker.GetTextCtrlValue()

问题:

Why isn't this working?

How can I make it work?


Tags: textpyselftxtaddid编辑any
2条回答

为什么没用?因为下面这一行:

infile = self.filePicker.GetTextCtrlValue()

在任何函数之外,并且在类定义中。它试图执行这行,因为类被定义以在类上创建一个infile属性,而且此时没有定义self,因此它抱怨没有定义{}。在

你怎么能做到呢?大概,您希望该行及其后一行位于您的__init__()方法中。相应地缩进它们。在

您正试图访问从继承的实例属性主图形用户界面作为类属性。一般来说,您尝试静态访问非静态属性。在

如果将infileoutfile_path定义为MyFrame的实例属性,则可以使用访问它们自身财产。在

(请注意,这样您需要更改对引用该方法的editar_txt方法的引用,因为不再需要该参数。)

编辑中修改的MyFrame类下面_文本.py

class MyFrame(gui.Main):
    def __init__(self, parent):
        gui.Main.__init__(self, parent)

        self.infile = self.filePicker.GetTextCtrlValue()
        self.outfile_path = self.infile[:len(self.infile)-4] + "_editado.txt"

    def editar_txt(self):
        outfile = []
        with open(self.infile) as f:
            for line in f:
                line_ed = line.replace("|VENDAS|0|", "|VENDAS|2|")
                outfile.append(line_ed)
        with open(self.outfile_path, "w") as g:
            for line in outfile:
                g.write(line)

        f.close()
        g.close()

相关问题 更多 >