combobox wxpython程序没有时间做出选择

时间:2012-08-13 23:47:55

标签: python wxpython

我正在写一个程序,所以我可以通过电子邮件和使用wxpython发送短信。使用Combobox选择电话号码附加到哪个运营商。但是,在我有机会选择运营商之前,该计划将继续其他所有内容。有没有办法让我停下来直到我做出选择?仍在学习如何复制/粘贴在这里,原谅任何缩进错误,这在我的代码中都是正确的。感谢大家! :)

  if password.ShowModal() == wx.ID_OK:
      pwd =password.GetValue()
      phone_number = wx.TextEntryDialog(self,"Phone Number", "Phone Number", "")
      if phone_number.ShowModal() == wx.ID_OK:
        number = phone_number.GetValue()
        self.carrier = wx.ComboBox(self, -1, pos=(10, 50), choices=carriers, style=wx.CB_READONLY)
        self.carrier.Bind(wx.EVT_COMBOBOX, self.onCombo)
        if self.carrier.ShowModal() == wx.EVT_COMBOBOX:
           message = wx.TextEntryDialog(self,"Your Message", "Your Message", "")
           if message.ShowModal() == wx.ID_OK:

              msg = message.GetValue()
              smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
              smtpserver.ehlo()
              smtpserver.starttls()
              smtpserver.ehlo
              smtpserver.login(username, pwd)
              header = 'To:' + email + '\n' + 'From: ' + username + '\n' + 'Subject:testing \n'
              print header
              msg1 = header + msg
              smtpserver.sendmail(username, email, msg1)
              smtpserver.close()

 def onCombo(self, event):


    self.selection = self.carrier.GetValue()
    print self.selection
    print self.number
    self.email = number + selection
    print email
    return self.email

1 个答案:

答案 0 :(得分:0)

我可以立即告诉您,self.carrier属于wx.ComboBox类型,并且没有ShowModal()方法。如果确实如此,则不会返回wx.EVT_COMBOBOXShowModal()方法返回单击的按钮的ID。 wx.EVT_COMBOBOX是一个事件,而不是一个ID,因此不会被退回。

wx.Dialog使用ShowModal()。看起来你想要的对象是wx.SingleChoiceDialog(你可以找到一个教程here,但你需要向下滚动大约7/8。或者只需点击ctrl+f和搜索“singlechoice”)。这将显示一个列表并提示用户进行单一选择。


或者,您可以创建自己的自定义对话框(教程herehere),其中包含您在一个方便的对话框中所需的所有信息(而不是三个单独的对话框)。

我写了粗略草稿,你可以在下面找到。请记住,我没有对其进行测试,因此可能存在错误,但它应该让您了解自己需要做什么。此外,您应该将对象放在sizer中,并按照您希望的方式组织布局。

class MyTxtMsgDialog (wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent=parent, title="My Txt Message Dialog")

        self.number = wx.TextCtrl(self)
        self.carrier = wx.ComboBox(self, -1, pos=(10, 50), choices=carriers, style=wx.CB_READONLY)
        self.message = wx.TextCtrl(self, style=wx.TC_MULTILINE) #means this TextCtrl will be multiple lines, not just one
        self.okButton = wx.Button(self, wx.ID_OK, "OK")
        #Setting the ID to wx.ID_OK is important. Any of the wx.ID_* variables work natively with ShowModal()
        #but if you created your own ID using the wx.NewId() method then you will need to manually call
        #"self.EndModal(<your ID>)" when your button is clicked.

然后使用以下方法调用它:

txtMsgDialog = MyTxtMsgDialog(self)
if txtMsgDialog.ShowModal() == wx.ID_OK: #check to see if OK was pressed
    #save the values
    self.number = txtMsgDialog.number.GetValue()
    self.carrier = txtMsgDialog.carrier.GetGetValue()
    self.message = txtMsgDialog.message.GetValue()

    txtMsgDialog.Destroy() #close the dialog

最后一点:正如您在我的示例中所看到的,当您完成所有对话框时,最好在所有对话框上调用Destroy()方法。这将关闭它们并释放资源。但请注意,因为在您调用此方法后,您尚未保存的任何变量都将消失。
我看到你没有打电话Destroy()的原因是因为您之前提出的问题的答案。这主要是一个风格问题,但我认为其他评论者是错误的,当你完成它们时,你应该破坏你的对话框。它会关闭对话框,释放您的资源,这就是编写所有教程的方式。