【问题标题】:Using wxPython to get input from user使用 wxPython 从用户那里获取输入
【发布时间】:2013-09-03 04:17:06
【问题描述】:

假设我需要将以下代码中的raw_input 函数替换为 wxPython 对话框,该对话框要求用户输入并将值返回给程序:

...
x = raw_input("What's your name?")
print 'Your name was', x
...

我只是在寻找一种简单的方法来做到这一点。 谢谢

【问题讨论】:

    标签: python wxpython user-input raw-input


    【解决方案1】:

    这是相当微不足道的。这是一种方法。

    import wx
    class Frame(wx.Frame):
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title=title, size=(-1, -1))
            self.panel = wx.Panel(self)
            self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
            self.btn = wx.Button(self.panel, -1, "Name-a-matic")
            self.Bind(wx.EVT_BUTTON, self.GetName, self.btn)
            self.txt = wx.TextCtrl(self.panel, -1, size=(140,-1))
            self.txt.SetValue('name goes here')
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.btn)
            sizer.Add(self.txt)
    
            self.panel.SetSizer(sizer)
            self.Show()
    
        def GetName(self, e):
    
            dlg = wx.TextEntryDialog(self.panel, 'Whats yo name?:',"name-o-rama","", 
                    style=wx.OK)
            dlg.ShowModal()
            self.txt.SetValue(dlg.GetValue())
            dlg.Destroy()
    
        def OnCloseWindow(self, e):
            self.Destroy()
    
    app = wx.App()
    frame = Frame(None, 'My Nameomatic')
    app.MainLoop()
    

    这是另一种方式:

    import wx
    
    class NameDialog(wx.Dialog):
        def __init__(self, parent, id=-1, title="Enter Name!"):
            wx.Dialog.__init__(self, parent, id, title, size=(-1, -1))
    
            self.mainSizer = wx.BoxSizer(wx.VERTICAL)
            self.buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
    
            self.label = wx.StaticText(self, label="Enter Name:")
            self.field = wx.TextCtrl(self, value="", size=(300, 20))
            self.okbutton = wx.Button(self, label="OK", id=wx.ID_OK)
    
            self.mainSizer.Add(self.label, 0, wx.ALL, 8 )
            self.mainSizer.Add(self.field, 0, wx.ALL, 8 )
    
            self.buttonSizer.Add(self.okbutton, 0, wx.ALL, 8 )
    
            self.mainSizer.Add(self.buttonSizer, 0, wx.ALL, 0)
    
            self.Bind(wx.EVT_BUTTON, self.onOK, id=wx.ID_OK)
            self.Bind(wx.EVT_TEXT_ENTER, self.onOK)
    
            self.SetSizer(self.mainSizer)
            self.result = None
    
        def onOK(self, event):
            self.result = self.field.GetValue()
            self.Destroy()
    
        def onCancel(self, event):
            self.result = None
            self.Destroy()
    
    class Frame(wx.Frame):
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title=title, size=(-1, -1))
            self.panel = wx.Panel(self)
            self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
            self.btn = wx.Button(self.panel, -1, "Name-a-matic")
            self.Bind(wx.EVT_BUTTON, self.GetName, self.btn)
            self.txt = wx.TextCtrl(self.panel, -1, size=(140,-1))
            self.txt.SetValue('name goes here')
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.btn)
            sizer.Add(self.txt)
    
            self.panel.SetSizer(sizer)
            self.Show()
    
        def GetName(self, e):
            dlg = NameDialog(self)
            dlg.ShowModal()
            self.txt.SetValue(dlg.result)
    
        def OnCloseWindow(self, e):
            self.Destroy()
    
    app = wx.App()
    frame = Frame(None, 'My Nameomatic')
    app.MainLoop()
    

    【讨论】:

    • 第一种方式结束时需要app.MainLoop()
    【解决方案2】:

    这是另一种简单的方法,可以满足我的要求:

    import wx
    
    def ask(parent=None, message='', default_value=''):
        dlg = wx.TextEntryDialog(parent, message, defaultValue=default_value)
        dlg.ShowModal()
        result = dlg.GetValue()
        dlg.Destroy()
        return result
    
    # Initialize wx App
    app = wx.App()
    app.MainLoop()
    
    # Call Dialog
    x = ask(message = 'What is your name?')
    print 'Your name was', x
    

    【讨论】:

    • 没有defaultValue参数,只有value
    • 我目前只使用 Python 3 并且不再安装 wxPython。但据我所知,文档中提到了defaultValue,我确信这段代码当时可以正常工作。
    • 必须是凤凰改动之一
    • 对于 Phoenix,将 defaultValue= default_value 更改为 value= default_value
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多