簡體   English   中英

AttributeError:“操作”對象沒有屬性“ text1”

[英]AttributeError: 'Action' object has no attribute 'text1'

經驗豐富的C程序員,對Python完全陌生。 使用python wx。 在名為Action的對象的定義中,我聲明:

    self.text2 = wx.StaticText(panel, label="Name")

但是當我在回調的主模塊中訪問它時:

    def OnComboSelect(self, e):
        print self.combo.GetValue()
        win = Action(self, "Action")
            win.text2.SetLabel("testing")

win.SetLabel(e,“動作”)

我懂了

AttributeError: 'Action' object has no attribute 'text2'

(我還要補充一點,我已經回答了所有24個“可能已經有了答案的問題”,但沒有發現任何問題。) 我檢查並重新檢查了所有拼寫。 我也嘗試過將此功能添加到Action的定義中:

    def SetLabel(self, event, label):
    self.text2.SetLabel("testing")

如果我打電話,會得到相同的錯誤:

win.text2.SetLabel("testing")

(驚喜!)。 (但是對於定義SetLabel的定義沒有任何抱怨)。 如果需要,這是完整的代碼(這是簡單的示例代碼,因此除了我不費力地修改它之外,它的排序也很不錯。):

#!/usr/bin/python
# -*- coding: utf-8 -*-

# action.py

import wx

class Action(wx.Frame):

    def __init__(self, parent, title):    
        super(Action, self).__init__(parent, title=title, 
            size=(450, 350))


    def InitUI(self):

        panel = wx.Panel(self)

        sizer = wx.GridBagSizer(5, 5)

        text1 = wx.StaticText(panel, label="Ink Cartridge Type")
        sizer.Add(text1, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM, 
            border=15)

        icon = wx.StaticBitmap(panel, bitmap=wx.Bitmap('ink64.png'))
        sizer.Add(icon, pos=(0, 4), flag=wx.TOP|wx.RIGHT|wx.ALIGN_RIGHT, 
            border=5)

        line = wx.StaticLine(panel)
        sizer.Add(line, pos=(1, 0), span=(1, 5), 
            flag=wx.EXPAND|wx.BOTTOM, border=10)

        self.text2 = wx.StaticText(panel, label="Name")
        sizer.Add(text2, pos=(2, 0), flag=wx.LEFT, border=10)

        self.tc1 = wx.TextCtrl(panel)
        sizer.Add(self.tc1, pos=(2, 1), span=(1, 3), flag=wx.TOP|wx.EXPAND)

        text3 = wx.StaticText(panel, label="Package")
        sizer.Add(text3, pos=(3, 0), flag=wx.LEFT|wx.TOP, border=10)

        tc2 = wx.TextCtrl(panel)
        sizer.Add(tc2, pos=(3, 1), span=(1, 3), flag=wx.TOP|wx.EXPAND, 
            border=5)

        button1 = wx.Button(panel, label="Browse...")
        sizer.Add(button1, pos=(3, 4), flag=wx.TOP|wx.RIGHT, border=5)

        text4 = wx.StaticText(panel, label="Extends")
        sizer.Add(text4, pos=(4, 0), flag=wx.TOP|wx.LEFT, border=10)

        combo = wx.ComboBox(panel)
        sizer.Add(combo, pos=(4, 1), span=(1, 3), 
            flag=wx.TOP|wx.EXPAND, border=5)

        button2 = wx.Button(panel, label="Browse...")
        sizer.Add(button2, pos=(4, 4), flag=wx.TOP|wx.RIGHT, border=5)

        sb = wx.StaticBox(panel, label="Optional Attributes")

        boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
        boxsizer.Add(wx.CheckBox(panel, label="Public"), 
            flag=wx.LEFT|wx.TOP, border=5)
        boxsizer.Add(wx.CheckBox(panel, label="Generate Default Constructor"),
            flag=wx.LEFT, border=5)
        boxsizer.Add(wx.CheckBox(panel, label="Generate Main Method"), 
            flag=wx.LEFT|wx.BOTTOM, border=5)
        sizer.Add(boxsizer, pos=(5, 0), span=(1, 5), 
            flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT , border=10)

        button3 = wx.Button(panel, label='Help')
        sizer.Add(button3, pos=(7, 0), flag=wx.LEFT, border=10)

        button4 = wx.Button(panel, label="Ok")
        sizer.Add(button4, pos=(7, 3))

        # Set event handlers
        button4.Bind(wx.EVT_BUTTON, self.OnButton)

        button5 = wx.Button(panel, label="Cancel")
        sizer.Add(button5, pos=(7, 4), span=(1, 1),  
            flag=wx.BOTTOM|wx.RIGHT, border=5)

        sizer.AddGrowableCol(2)

        panel.SetSizer(sizer)

    def OnButton(self, event):
        self.tc1.GetValue()

    def SetLabel(self, event, label):
        self.text2.SetLabel("testing")

直到使用InitUI方法,您才創建text2屬性。 但是您正在嘗試在調用該方法之前訪問它。

通常,在wx的InitUI習慣用法中,您可以通過__init__方法顯式調用self.InitUI() ,如本例所示 你沒那么做

因此,當您這樣做時:

win = Action(self, "Action")
win.text2.SetLabel("testing")

您已調用win.__init__ ,但尚未調用InitUI ,也沒有任何其他內容,因此該屬性尚不存在。

您必須使text1 self.text1以及您希望此類具有的所有其他屬性。 正如text1一樣,它只是InitUI中的局部變量。

抱歉,閱讀不仔細。

您可以將win.text2.SetLabel(“ testing”)更改為win.text2 =“ testing”,此代碼在此處的方式python認為text2是Action內部的一個對象,其自身的方法稱為SetLabel。 那就是為什么它找不到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM