Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Button wxpython单击关闭父级按钮_Button_Wxpython_Parent - Fatal编程技术网

Button wxpython单击关闭父级按钮

Button wxpython单击关闭父级按钮,button,wxpython,parent,Button,Wxpython,Parent,我整个上午都在寻找最简单的东西,但我要么没有找到正确的地方,要么没有理解我正在阅读的答案,因为迄今为止我所尝试的一切都失败了 我正在创建一个带有标签、文本输入框和保存按钮的对话框。用户在框中输入文本,单击保存,文本保存到变量中,对话框应关闭。我不能让最后一点发生。我最接近的方法是销毁按钮和灰色背景,但保留面板本身完好无损。我在寻找某种解决方案。。。我的主要问题是,当我单击按钮时,我需要两个独立的事情发生(保存和退出),因此,当我在保存变量后调用on click函数时,我不再有控制权关闭主窗口。我

我整个上午都在寻找最简单的东西,但我要么没有找到正确的地方,要么没有理解我正在阅读的答案,因为迄今为止我所尝试的一切都失败了

我正在创建一个带有标签、文本输入框和保存按钮的对话框。用户在框中输入文本,单击保存,文本保存到变量中,对话框应关闭。我不能让最后一点发生。我最接近的方法是销毁按钮和灰色背景,但保留面板本身完好无损。我在寻找某种解决方案。。。我的主要问题是,当我单击按钮时,我需要两个独立的事情发生(保存和退出),因此,当我在保存变量后调用on click函数时,我不再有控制权关闭主窗口。我知道这是很基本的东西,但我就是搞不懂

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)

似乎您正在尝试将子类a
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()

它有点凌乱,但我现在没有时间清理它,它应该在showconnstring类中使用一个sizer

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

您是否尝试过self.Destroy()是。Self.destroy()删除了框的内部,即按钮、灰色背景和文本框,但框架本身仍显示为深灰色。我可以这样做,但我需要向对话框中添加一些额外的按钮和文本对象,这就是我创建该类的原因。不过,我在这个阶段完全迷失了方向,我想我已经吃得太多了!我在主类中创建了一个框架,然后它承载来自被调用类的面板,并且这个框架没有被破坏。如果我没有在主应用程序中创建框架,我将无法显示它。我完全走错了路,现在我根本无法修复它,所以我认为我最好的办法是从头开始。我没有得到“结果”的东西。它应该是一个内置的财产吗?哪个班有?当我尝试从调用类打印dlg.result时,它失败了,因为AttributeError:“ShowConnString”对象没有属性“result”。与使用参数self.panel-dlg=ShowConnString(parent=self.panel)==AttributeError调用ShowConnString相同:“Audit”对象没有属性“panel”,我在对话框中添加了更多选项,以显示可以执行的操作。“结果内容”在
def SaveConnString
中定义。请注意,类ShowConnString(wx.Dialog)是一个对话框,它的
\uuuu init\uuuu
也是一个对话框。如果有疑问,请按原样运行我的代码。终于找到了!万分感谢