【问题标题】:WxPython GUI programming - NameError: name "self" is not definedWxPython GUI 编程 - NameError: name "self" is not defined
【发布时间】:2016-01-13 02:31:39
【问题描述】:

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

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

gui.py & edit_text.py

这是 gui.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()
    

这是 edit_txt.py

的代码
# -*- coding: utf-8 -*-
import gui
import wx

class MyFrame(gui.Main):
    def __init__(self, parent):
        gui.Main.__init__(self, parent)
        
    infile = self.filePicker.GetTextCtrlValue()
    outfile_path = infile[:len(infile)-4] + "_editado.txt"
    
    def editar_txt(self, infile):
        outfile = []
        with open(infile) as f:
            for line in f:
                line_ed = line.replace("|VENDAS|0|", "|VENDAS|2|")
                outfile.append(line_ed)
        with open(outfile_path, "w") as g:
            for line in outfile:
                g.write(line)

        f.close()
        g.close()
  
class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None)
        self.SetTopWindow(self.frame)
        self.frame.Show(True)
        print("\n----------------------------------------\nEditor MAVB - inicializado com sucesso. \n----------------------------------------")
        return True
        
if __name__ == "__main__":
    app = MyApp(redirect=False)
    app.MainLoop() 

当我进入程序文件夹并运行edit_txt.py时,出现以下错误:

Error in line 
infile = self.filePicker.GetTextCtrlValue()
NameError: name 'self' is not defined
  1. 我在 gui.py 中创建了一个 Main 类
  2. 将 gui.py 脚本导入 edit_txt.py
  3. 从 gui.Main 类创建了一个继承的 MyFrame 类
  4. 我一打开程序就初始化了 MyFrame 类
  5. 然后我尝试使用以下命令获取 infile 路径:infile = self.filePicker.GetTextCtrlValue()

问题:

为什么这不起作用?

我怎样才能让它工作?

【问题讨论】:

  • 如果我从infile = self.filePicker.GetTextCtrlValue() 开始再添加1 个标签并转到g.close(),则代码在我运行时至少会显示GUI 窗口...
  • 您的行 infile = self.filePicker.GetTextCtrlValue() 缩进严重,超出了任何函数的范围,因此未定义 self。只需缩进它和下一个,这个错误至少应该消失。
  • @BenjaminAudren,我用infile = self.filePicker.GetTextCtrlValue()outfile_path = infile[:len(infile)-4] + "_editado.txt"缩进了这些行,然后我让我的代码打印这些变量。变量ìnfile`等于“”,变量outfile_path等于“_editado.txt”。我猜这是因为首先用户必须浏览文件以将值设置为wx.FilePickerCtrl。你知道我该如何解决这个问题吗?
  • 哦,在缩进并执行它之后,当我按下editar_txt() 按钮时,我收到以下错误:TypeError: editar_txt() takes exactly 1 argument (2 given)。我猜这是因为 GetTextCtrlValue() 正在返回类似 r"C:/folder" 的东西,但是 idk...

标签: python user-interface wxpython wxwidgets nameerror


【解决方案1】:

您正在尝试访问从 gui.Main 继承的实例属性作为类属性。一般来说,您正在尝试静态访问非静态属性。

如果您将 infileoutfile_path 定义为 MyFrame 的实例属性,则可以使用 self.Property em>。

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

edit_txt.py中修改后的MyFrame类下面:

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()

【讨论】:

    【解决方案2】:

    为什么它不起作用?因为下面一行:

    infile = self.filePicker.GetTextCtrlValue()
    

    在任何函数之外,并且在类定义中。它正在尝试执行这一行定义类以在类上创建infile 属性,并且由于此时未定义self,它抱怨self not正在定义中。

    如何让它发挥作用?据推测,您打算将该行及其后面的行放在您的 __init__() 方法中。相应地缩进它们。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2022-12-02
      • 2017-11-15
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2020-11-07
      相关资源
      最近更新 更多