0

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

  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
4

1 回答 1

0

马上我可以告诉你那self.carrier是类型wx.ComboBox并且没有ShowModal()方法。如果它这样做了,它就不会返回wx.EVT_COMBOBOX。该ShowModal()方法返回被单击的按钮的 ID。wx.EVT_COMBOBOX是一个事件,而不是一个 ID,因此不会被返回。

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


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

我写了草稿,你可以在下面找到。请记住,我尚未对其进行测试,因此可能会出现错误,但它应该让您了解需要做什么。此外,您可能应该将对象放置在 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()是因为您之前提出的问题的答案。这主要是一个风格问题,但我认为其他评论者错了,当你完成对话时,你应该破坏你的对话。它关闭对话框,释放您的资源,这是编写所有教程的方式。

于 2012-08-15T05:59:08.270 回答