2013-08-30 15 views
3

想我需要与要求用户输入和值返回程序的wxPython对话框来代替raw_input功能在下面的代码:使用wxPython的从用户那里获取输入

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

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

回答

3

这里是另一个简单的办法是做什么,我一直在寻找:

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 
+0

没有'defaultValue'参数,它只是'value' – Dan

+0

我目前只使用Python 3,并且没有安装wxPython。但据我可以看到['defaultValue'](http://www.wxpython.org/docs/api/wx.TextEntryDialog-class.html)在文档中提到,我确信这段代码工作正常当时。 – AXO

+1

必须是凤凰城变化之一 – Dan

2

这是相当平凡的。这是一种方法。

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() 
+1

你需要'app.MainLoop()'在第一种方式结束 – Bull