如何从wxpython的文本控件获取输入文本并输出答案
我真正需要帮助的是第112行的函数。我正在尝试创建一个图形界面的计算器,但我遇到的问题是,当用户输入一个算式,比如5+5时,它无法把这个算式存储到一个变量里。那么我该怎么解决这个问题,并把结果输出到文本框里呢?谢谢!
import math
import wx
class justin(wx.Frame):
loop=False
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,'MAP2', size=(250, 300))
panel=wx.Panel(self)
status=self.CreateStatusBar()
file_menu = wx.MenuBar()
menu1=wx.Menu()
menu2=wx.Menu()
exit1=menu1.Append(wx.NewId(),"exit","exit")
info1=menu1.Append(wx.NewId(),"info","info")
instr=menu2.Append(wx.NewId(),"instructions","instructions")
file_menu.Append(menu1,"file")
file_menu.Append(menu2,"instructions")
self.SetMenuBar(file_menu)
self.panel = panel
self.Bind(wx.EVT_MENU, self.onexit, exit1)
self.Bind(wx.EVT_MENU, self.oninfo, info1)
self.Bind(wx.EVT_MENU, self.oninstr, instr)
self.box=wx.TextCtrl(panel,-1,"",(0,0),(180,45))
self.button1=wx.Button(panel,label='1', size=(45,45))
self.button2=wx.Button(panel,label='2', size=(45,45))
self.button3=wx.Button(panel,label='3', size=(45,45))
self.button4=wx.Button(panel,label='4', size=(45,45))
self.button5=wx.Button(panel,label='5', size=(45,45))
self.button6=wx.Button(panel,label='6', size=(45,45))
self.button7=wx.Button(panel,label='7', size=(45,45))
self.button8=wx.Button(panel,label='8', size=(45,45))
self.button9=wx.Button(panel,label='9', size=(45,45))
self.buttonplus=wx.Button(panel,label='+', size=(45,45))
self.buttonsub=wx.Button(panel,label='-', size=(45,45))
self.buttonmul=wx.Button(panel,label='*', size=(45,45))
self.buttondiv=wx.Button(panel,label='/', size=(45,45))
self.button0=wx.Button(panel,label='0', size=(45,45))
self.enter=wx.Button(panel,label='enter',size=(45,45))
siz=wx.GridBagSizer(5,5)
siz.Add(self.button1,pos=(2,0))
siz.Add(self.button2,pos=(2,1))
siz.Add(self.button3,pos=(2,2))
siz.Add(self.button4,pos=(3,0))
siz.Add(self.button5,pos=(3,1))
siz.Add(self.button6,pos=(3,2))
siz.Add(self.button7,pos=(4,0))
siz.Add(self.button8,pos=(4,1))
siz.Add(self.button9,pos=(4,2))
siz.Add(self.buttonplus,pos=(2,3))
siz.Add(self.buttonsub,pos=(3,3))
siz.Add(self.buttonmul,pos=(4,3))
siz.Add(self.buttondiv,pos=(5,3))
siz.Add(self.button0,pos=(5,2))
siz.Add(self.enter,pos=(5,0))
panel.SetSizer(siz)
self.Bind(wx.EVT_BUTTON,self.ebutton1,self.button1)
self.Bind(wx.EVT_BUTTON,self.ebutton2,self.button2)
self.Bind(wx.EVT_BUTTON,self.ebutton3,self.button3)
self.Bind(wx.EVT_BUTTON,self.ebutton4,self.button4)
self.Bind(wx.EVT_BUTTON,self.ebutton5,self.button5)
self.Bind(wx.EVT_BUTTON,self.ebutton6,self.button6)
self.Bind(wx.EVT_BUTTON,self.ebutton7,self.button7)
self.Bind(wx.EVT_BUTTON,self.ebutton8,self.button8)
self.Bind(wx.EVT_BUTTON,self.ebutton9,self.button9)
self.Bind(wx.EVT_BUTTON,self.ebutton0,self.button0)
self.Bind(wx.EVT_BUTTON,self.ebuttonplus,self.buttonplus)
self.Bind(wx.EVT_BUTTON,self.ebuttonsub,self.buttonsub)
self.Bind(wx.EVT_BUTTON,self.ebuttonmul,self.buttonmul)
self.Bind(wx.EVT_BUTTON,self.ebuttondiv,self.buttondiv)
self.Bind(wx.EVT_BUTTON,self.eenter,self.enter)
def ebutton1(self,e):
self.box.AppendText('1')
def ebutton2(self,e):
self.box.AppendText('2')
def ebutton3(self,e):
self.box.AppendText('3')
def ebutton4(self,e):
self.box.AppendText('4')
def ebutton5(self,e):
self.box.AppendText('5')
def ebutton6(self,e):
self.box.AppendText('6')
def ebutton7(self,e):
self.box.AppendText('7')
def ebutton8(self,e):
self.box.AppendText('8')
def ebutton9(self,e):
self.box.AppendText('9')
def ebutton0(self,e):
self.box.AppendText('0')
def ebuttonplus(self,e):
self.box.AppendText('+')
def ebuttonsub(self,e):
self.box.AppendText('-')
def ebuttonmul(self,e):
self.box.AppendText('*')
def ebuttondiv(self,e):
self.box.AppendText('/')
def eenter(self,e):
a=self.box.GetValue()
answer=int(a)
ans=str(answer)
self.box.SetValue(ans)
def onexit(self,e):
self.Close()
def oninfo(self,e):
dlg = wx.MessageDialog(None,"This is a program that computes percent error value. MAP2 is created by Justin Rolf","info",wx.OK)
dlg.ShowModal()
dlg.Destroy()
def oninstr(self,e):
dlg1 = wx.MessageDialog(None,"To use this program enter your first number in the top gray box (make sure to have all text deleted before you type), then enter your second number in the bottom box, and hit the enter button","instructions",wx.OK)
dlg1.ShowModal()
dlg1.Destroy()
if __name__=='__main__':
app=wx.PySimpleApp()
frame=justin(parent=None, id=-1)
frame.Show()
app.MainLoop()
1 个回答
1
我觉得你的问题出在这里:
def eenter(self,e):
a=self.box.GetValue()
answer=int(a)
ans=str(answer)
self.box.SetValue(ans)
它不工作是因为 a
是一个字符串,不能直接转换成整数。
你可以在这里找到一个wxPython计算器的例子。这个例子只用了不到50行代码,所以你可以从中学到很多东西。另一个例子在这里。
你会发现他们使用了Python的内置函数eval来处理输入的字符串。对于你的情况,这可以表示为:
answer = eval(a)
eval
通常不推荐在一般代码中使用。因为它会执行任何接收到的字符串,所以被认为是危险的。不过,对于你的情况,它是一个有效的替代方案(另一个方法是解析输入字符串,并将操作符字符与Python的operator方法或自定义函数绑定)。