У меня есть текстовое поле в wxpython (см. ниже), в котором хранится имя значения как переменной.
Я пытаюсь сделать две вещи:
После ввода ответа я хочу отобразить другой вопрос и назначить новый ответ другой переменной с использованием того же или идентификационного окна TextEntryDialog.
В идеале, с точки зрения пользователя, они просто видят приглашение, набирают ответ (или выбирают из списка), а затем после нажатия "ОК" запрос будет изменен, и они будут вводить новый ответ (который будет назначается новой переменной).
Так почему я пытаюсь это сделать? Так что после окончания этого сеанса Q и A я могу записать все переменные в базу данных с помощью 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 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()
Я не рекомендую создавать и уничтожать 250 диалогов, как это сделал другой парень. Я бы, вероятно, создал список или dict в начале моей программы, которые будут добавляться в случае, когда пользователь вводит ответ. Также в этом обработчике событий я бы reset элемент управления StaticText задал новый вопрос. Возможно, вам придется обновить экран, если ваши вопросы будут сильно различаться по длине, но я думаю, что это будет намного лучше, чем показывать сотни диалогов подряд.
EDIT. Добавлен код примера ниже:
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()
Вы можете даже сделать что-то вроде:
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
.
pickle
. Это позволит вам сохранить dict (или другой объект данных) в файл в любое время, и даст вам несколько вариантов восстановления ответов пользователя в случае возникновения проблемы.