我正在写一个程序,所以我可以通过电子邮件和使用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
答案 0 :(得分:0)
我可以立即告诉您,self.carrier
属于wx.ComboBox
类型,并且没有ShowModal()
方法。如果确实如此,则不会返回wx.EVT_COMBOBOX
。 ShowModal()
方法返回单击的按钮的ID。 wx.EVT_COMBOBOX
是一个事件,而不是一个ID,因此不会被退回。
仅wx.Dialog
使用ShowModal()
。看起来你想要的对象是wx.SingleChoiceDialog
(你可以找到一个教程here,但你需要向下滚动大约7/8。或者只需点击ctrl+f
和搜索“singlechoice”)。这将显示一个列表并提示用户进行单一选择。
或者,您可以创建自己的自定义对话框(教程here和here),其中包含您在一个方便的对话框中所需的所有信息(而不是三个单独的对话框)。
我写了粗略草稿,你可以在下面找到。请记住,我没有对其进行测试,因此可能存在错误,但它应该让您了解自己需要做什么。此外,您应该将对象放在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()
的原因是因为您之前提出的问题的答案。这主要是一个风格问题,但我认为其他评论者是错误的,当你完成它们时,你应该破坏你的对话框。它会关闭对话框,释放您的资源,这就是编写所有教程的方式。