Wxpython - 如何在不关闭应用的情况下生成一系列文本提示?
我在wxpython中有一个文本框(见下文),它用来存储一个值的名称作为变量。
我想做两件事:
在用户输入答案后,我想显示另一个问题,并把新的答案赋值给另一个变量,使用同样的或相似的文本输入对话框。
理想情况下,从用户的角度来看,他们只需要看到一个提示,输入答案(或者从列表中选择),然后点击确认后,提示会改变,他们可以输入新的答案(这个答案会被赋值给一个新的变量)。
我为什么想这么做呢?因为在这个问答环节结束后,我可以使用pyodbc把所有的变量写入数据库(现在我不需要了解这个)。
所以,你能告诉我怎么在用户输入答案后自动生成新的提示,而不关闭应用程序并丢失变量数据吗?有没有办法在用户回答的同时自动备份这些变量数据,以防应用程序崩溃?我的问题列表大约有250个问题,我不想在应用程序崩溃时丢失所有这些变量(它们经常崩溃)。
谢谢!
import wx
class applicationName(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Title', size=(300,200))
#create panel and button
panel = wx.Panel(self)
test = wx.TextEntryDialog(None, "What's your name?", 'Title', 'Enter name')
if test.ShowModal() == wx.ID_OK:
apples = test.GetValue()
wx.StaticText(panel, -1, apples, (10,10))
if __name__ =='__main__':
app = wx.PySimpleApp()
frame = applicationName(parent=None, id=-1)
frame.Show()
app.MainLoop()
2 个回答
1
- 写一个函数,让用户输入信息,并显示这个输入框,同时返回用户输入的内容。
- 把这个函数放在一个循环里。
你甚至可以这样做:
answers = [getanswer(q) for q in questions]
getanswer
这个函数可能看起来像这样:
def getanswer(q):
test = wx.TextEntryDialog(None, *q)
if test.ShowModal() == wx.ID_OK:
return test.GetValue() # returns None the user didn't select OK.
questions
可以包含你想传给 wx.TextEntryDialog
的列表或元组。
3
我不建议像其他人那样创建和销毁250个对话框。我会在程序开始时创建一个列表或者字典,每当用户输入答案时,就把答案加到这个列表或字典里。同时,在处理这个事件的地方,我会用一个新问题来重置静态文本控件。如果你的问题长度差别很大,可能需要刷新一下屏幕,但我觉得这样比连续显示几百个对话框要好得多。
编辑 - 下面添加了一些示例代码:
import wx
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
self.answers = {}
self.questions = ["What is your age?", "What is your weight?",
"Which of the following computer languages is the best ever: C++, PHP, Fortran, COBOL, Python?"]
self.nextQuestion = 0
self.question = wx.StaticText(panel, label="What is your name?")
self.answer = wx.TextCtrl(panel, value="")
submitBtn = wx.Button(panel, label="Submit")
submitBtn.Bind(wx.EVT_BUTTON, self.onSubmit)
sizer = wx.BoxSizer(wx.VERTICAL)
self.panelSizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.question, 0, wx.ALL, 5)
sizer.Add(self.answer, 0, wx.ALL|wx.EXPAND, 5)
sizer.Add(submitBtn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
self.panelSizer.Add(panel, 1, wx.EXPAND)
self.SetSizer(self.panelSizer)
#----------------------------------------------------------------------
def onSubmit(self, event):
""""""
self.answers[self.question.GetLabel()] = self.answer.GetValue()
self.question.SetLabel(self.questions[self.nextQuestion])
self.answer.SetValue("")
self.nextQuestion += 1
print self.answers
self.panelSizer.Fit(self)
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()