如何在Python中保存用户文本框输入?

1 投票
1 回答
728 浏览
提问于 2025-04-18 13:54

我正在尝试制作一个弹出窗口,这个窗口可以让用户输入两段文本,然后当用户点击“确定”时,它会记录这些数据。我的问题是,当我试图定义“确定”按钮被按下时的功能来记录数据时,出现了一个错误:AttributeError: 'apples' object has no attribute 'TextCtrlInstance',也就是说当我点击确定时,程序出错了。

class apples(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Add a stock',size=(300,300))
        frames=wx.Panel(self)
        frames.Bind(wx.EVT_MOTION, self.OnMove)
        frames.Bind(wx.EVT_MOTION, self.count)
        howmuch=wx.TextCtrl(frames,-1,'#of',pos=(200,173))
        cancel=wx.Button(frames,label='Cancel',pos=(100,250),size=(60,40))
        self.Bind(wx.EVT_BUTTON, self.ca, cancel)
        wx.StaticText(frames,-1,'Enter in valid stock ticker:',pos=(10,50))
        what=wx.TextCtrl(frames,-1,'AAPL',pos=(200,48))
        okbutton = wx.Button(frames,label='OK',pos=(200,250),size=(60,40))
        self.Bind(wx.EVT_BUTTON,self.oker,okbutton)
        wx.StaticText(frames,-1,'Enter in nuber of shares:',pos=(10,175))
    def ca(self,event):
        self.Destroy()
    def oker(self,event):
        #I need the user info when they press ok
        print 'Saved!'
        self.TextCtrlInstance.GetValue()
        self.Destroy()
    def OnMove(self,event):
        pass 
    def count(self,event):
        pass
if __name__ =='__main__':
    apps = wx.PySimpleApp()
    windows = apples(parent=None,id=-1)
    windows.Show()
    apps.MainLoop()

我希望这些信息能帮助我找到解决方案!谢谢,期待大家的回答!

1 个回答

1

这是一个经过思考的猜测,因为我没有运行你的代码:

def __init__(self,parent,id):
    wx.Frame.__init__(self,parent,id,'Add a stock',size=(300,300))
    self.frames=wx.Panel(self)
    self.frames.Bind(wx.EVT_MOTION, self.OnMove)
    self.frames.Bind(wx.EVT_MOTION, self.count)
    self.howmuch=wx.TextCtrl(frames,-1,'#of',pos=(200,173))
    self.cancel=wx.Button(frames,label='Cancel',pos=(100,250),size=(60,40))
    self.Bind(wx.EVT_BUTTON, self.ca, cancel)
    wx.StaticText(frames,-1,'Enter in valid stock ticker:',pos=(10,50))
    self.what=wx.TextCtrl(frames,-1,'AAPL',pos=(200,48))
    self.okbutton = wx.Button(frames,label='OK',pos=(200,250),size=(60,40))
    self.Bind(wx.EVT_BUTTON,self.oker,okbutton)
    wx.StaticText(frames,-1,'Enter in nuber of shares:',pos=(10,175))

[...]

def oker(self,event):
    qty = self.howmuch.GetValue()
    what = self.what.GetValue()
    print "Saved", qty, "of", what

如果你想在同一个对象的其他方法中访问不同的控件,你需要把它们存储为实例变量。在Python中,这样写:self.varname = ....。通常是在__init__这个特殊的方法里。你可能漏掉了很多这样的变量(也许不是我添加的所有变量 -- 具体情况可能不同)。

然后,GetValue是TextCtrl类的一个方法。要使用它,必须在该类的一个实例上调用。

根据你的代码,唯一两个(可见的)TextCtrl实例是"self.howmuch"和"self.what"。

撰写回答