Wxpython - как создать серию текстовых подсказок, не закрывая приложение?

1

У меня есть текстовое поле в 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()
  • 0
    Поскольку я не видел упоминаний о сохранении прогресса пользователя в ответах, взгляните на модуль pickle . Это позволит вам сохранить dict (или другой объект данных) в файл в любое время, и даст вам несколько вариантов восстановления ответов пользователя в случае возникновения проблемы.
Теги:
wxpython

2 ответа

3
Лучший ответ

Я не рекомендую создавать и уничтожать 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()
  • 0
    Майк, спасибо за ответ. Я новичок в программировании, можно ли будет привести пример с кодом? Огромное спасибо. Кроме того, некоторые вопросы длинные, и на большинство вопросов есть ответы с несколькими вариантами ответов, поэтому я буду использовать список. Я не уверен, изменит ли это весь словарный подход, но кажется, что может.
  • 0
    Я добавил простой пример. Это приводит к изменению размера фрейма и незначительной ошибке, которая случается, если вы нажимаете «Отправить» слишком много раз, но я оставлю это для вас, чтобы вы могли его отловить.
Показать ещё 2 комментария
1
  • Напишите функцию, которая вводит диалог и отображает и возвращает значение, введенное пользователем.
  • Поместите его в цикл for

Вы можете даже сделать что-то вроде:

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню