Wxpython - 如何在不关闭应用的情况下生成一系列文本提示?

1 投票
2 回答
597 浏览
提问于 2025-04-16 19:03

我在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()

撰写回答