2017-03-02 84 views
0

我一直在寻找整个早上应该是最简单的事情,但我要么不在正确的地方寻找,要么不了解我正在阅读的答案,因为我试过的所有东西迄今为止失败了。wxpython关闭父母点击按钮

我正在创建一个带有标签,文本输入框和保存按钮的对话框。用户在框中输入文本,点击保存,文本保存到一个变量,对话框应该关闭。我无法获得最后一刻的发生。我来最近的是摧毁按钮和灰色背景,但保持面板本身完好无损。我正在寻找某种KillParent解决方案...我的主要问题是,当我点击按钮时,我需要两个单独的事情发生(保存并退出),所以当我完成变量保存后调用点击功能我不再控制杀死主窗口。我知道这是非常基本的东西,但我无法弄清楚。

class ShowConnString(wx.Panel): 
def __init__(self, parent): 
    wx.Panel.__init__(self, parent) 

    self.saveButton =wx.Button(self, label="Save", pos=(360, 50)) 

    self.lblname = wx.StaticText(self, label="ConnectionString:", pos=(20,20)) 
    self.editname = wx.TextCtrl(self, value="server='(local)', database='Audit', uid='sa', pwd='_PWD4sa_'", pos=(125, 18), size=(600,-1)) 

    self.saveButton.Bind(wx.EVT_BUTTON, self.SaveConnString) 

def SaveConnString(self, event): 
    self.editname.SelectAll() 
    self.connstringtext = self.editname.GetStringSelection() 
    print (self.connstringtext) 
+0

您是否试过'self.Destroy()' –

+0

是的。 Self.destroy()杀死了盒子的内部,即,按钮,灰色背景和文本框,但框架本身仍显示为深灰色。 – pickarooney

回答

1

它有点乱,但我没有时间把它清理干净的那一刻,就应该在showconnstring类使用分级机。

import wx 
class MyFrame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, -1, "Dialog Test",size=(500,400)) 
     self.panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.log = wx.TextCtrl(self.panel, wx.ID_ANY, size=(400,300),style = wx.TE_MULTILINE|wx.TE_READONLY|wx.VSCROLL) 
     self.button = wx.Button(self.panel, label="Click me") 
     sizer.Add(self.log, 0, wx.EXPAND | wx.ALL, 10) 
     sizer.Add(self.button, 0, wx.EXPAND | wx.ALL, 10) 
     self.panel.SetSizer(sizer) 
     self.Bind(wx.EVT_BUTTON, self.OnButton) 

    def OnButton(self,event): 
     dlg = ShowConnString(parent = self.panel) 
     dlg.ShowModal() 
     if dlg.result_name: 
      self.log.AppendText("Name: "+dlg.result_name+"\n") 
      self.log.AppendText("Spin: "+str(dlg.result_spin)+"\n") 
      self.log.AppendText("Choice: "+str(dlg.result_choice)+"\n") 
     else: 
      self.log.AppendText("No selection made\n") 
     dlg.Destroy() 

class ShowConnString(wx.Dialog): 
    def __init__(self, parent): 
     wx.Dialog.__init__(self, parent, wx.ID_ANY, "Save", size= (650,220)) 
     self.panel = wx.Panel(self,wx.ID_ANY) 

     self.lblname = wx.StaticText(self.panel, label="Connection", pos=(20,20)) 
     self.editname = wx.TextCtrl(self.panel, value="server=127.0.0.1", pos=(110,20), size=(500,-1)) 
     self.lbl_1 = wx.StaticText(self.panel, wx.ID_ANY, ("Spin Control"), pos=(20,60)) 
     self.spin = wx.SpinCtrl(self.panel, wx.ID_ANY, "", min=1, max=10, pos=(110,60)) 
     self.lbl_2 = wx.StaticText(self.panel, wx.ID_ANY, ("Choice"),pos=(20,100)) 
     self.choice = wx.Choice(self.panel, wx.ID_ANY, choices=[("Choice 1"), ("Choice 2"), ("Choice 3")], pos=(110,100)) 
     self.saveButton =wx.Button(self.panel, label="Save", pos=(110,160)) 
     self.closeButton =wx.Button(self.panel, label="Cancel", pos=(210,160)) 
     self.saveButton.Bind(wx.EVT_BUTTON, self.SaveConnString) 
     self.closeButton.Bind(wx.EVT_BUTTON, self.OnQuit) 
     self.Bind(wx.EVT_CLOSE, self.OnQuit) 
     self.spin.SetValue(0) 
     self.choice.SetSelection(0) 
     self.Show() 

    def OnQuit(self, event): 
     self.result_name = None 
     self.Destroy() 

    def SaveConnString(self, event): 
     self.result_name = self.editname.GetValue() 
     self.result_spin = self.spin.GetValue() 
     self.result_choice = self.choice.GetSelection() 
     self.Destroy() 

app = wx.App() 
frame = MyFrame(None) 
frame.Show() 
app.MainLoop() 
+0

我没有得到'结果'的东西。它应该是一个内置的财产?它有哪些类?当我尝试从调用类打印dlg.result时,它失败并出现AttributeError:'ShowConnString'对象没有'result'属性。与使用参数self.panel调用ShowConnString一样 - dlg = ShowConnString(parent = self.panel)== AttributeError:'Audit'对象没有属性'Panel' – pickarooney

+0

我在对话框中添加了更多选项,以显示有些事情你可以做。 “结果事情”在'def SaveConnString'中定义。请注意,类ShowConnString(wx.Dialog)与其__init__一样是一个对话框。如果有疑问,请按原样运行我的代码。 –

+0

明白了,终于!太感谢了 – pickarooney

0

看来,你正试图子类wx.TextEntryDialog但使用wx.Panel
你也许会发现要简单得多,只需使用一个wx.TextEntryDialog即直接

import wx 
app = wx.App() 
dlg = wx.TextEntryDialog(None,"Connection String:","Save","server='(local)', database='Audit', uid='sa', pwd='_PWD4sa_'") 
dlg.SetSize((600,180)) 
if dlg.ShowModal() == wx.ID_OK: 
    text = dlg.GetValue() 
    print text 
dlg.Destroy() 
+0

我可以做到这一点,但我需要添加一些额外的按钮和文本对象到对话框,所以这就是为什么我做的课程。尽管我在这个阶段完全迷失了,但我觉得我咬过的东西比我咀嚼的更多!我在主类中创建一个框架,然后从被调用的类中托管面板,并且这个框架没有被破坏。如果我没有在主应用程序中创建框架,我无法显示它。我完全错误地解决了这个问题,现在我无法修复它,所以我认为我最好的选择是从头开始。 – pickarooney