多个类之间的wxpython事件处理

2024-05-01 13:47:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在wxpython有两个班wx.框架班级和awx.对话框(日历对话框)类

我的日历对话框如下所示:

class Calendar(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title)

        vbox = wx.BoxSizer(wx.VERTICAL)

        self.calend = cal.CalendarCtrl(self, -1, wx.DateTime_Now(),
            style = cal.CAL_SHOW_HOLIDAYS|cal.CAL_SEQUENTIAL_MONTH_SELECTION)
        vbox.Add(self.calend, 0, wx.EXPAND | wx.ALL, 20)

        vbox.Add((-1, 20))

        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        btn = wx.Button(self, -1, 'Ok')
        cancelBtn = wx.Button(self, -1, 'Cancel')
        hbox2.Add(btn, 1)
        hbox2.Add(cancelBtn, 1)
        vbox.Add(hbox2, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 20)

        btn.Bind(wx.EVT_BUTTON, self.okClicked)
        cancelBtn.Bind(wx.EVT_BUTTON, self.OnQuit)

        self.SetSizerAndFit(vbox)

        self.Show(True)
        self.Centre()


    def okClicked(self, event):
        date = self.calend.GetDate()
        print date
        return date

我从frame类调用日历对话框,如下所示

^{pr2}$

如何在我的wx.框架类返回到日历对话框类中的返回日期?在


Tags: self框架adddateinitdefcaldialog
2条回答

在calClick1中,创建以self为父级的日历实例:

calObj = Calendar(self, -1, 'test cal')

在Calendar类中添加以下内容: self.parent = parentwx.Dialog.__init__(...)之后。 现在您可以访问日历中框架的属性。示例:

如果你有帧内类,比如:

^{pr2}$

您可以在类日历的okClicked方法中更改它:

self.parent.txt.SetValue('some new string value')

如wxPython演示所示,当您调用showmodel()时,它应该在if语句中使用:

if calObj.ShowModal() == wx.ID_OK:

如果你要改变:

^{pr2}$

收件人:

def okClicked(self, event):
    self.date = self.calend.GetDate()
    print self.date
    return self.date

你的日期变量对类是全局的,你可以通过calObj在框架内访问它,比如:计算日期

你可以这样做,这样你就可以在对话框关闭后对框架的TextCtrl进行更改,而不是回调用父对象:(当然,这并不是说有什么问题!;)

未经测试,但下面的方法应该能帮你解决问题:

# Dialog
class Calendar(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title)

        self.date = wx.DateTime_Now() #create global variable 'self.date'

        vbox = wx.BoxSizer(wx.VERTICAL)
        self.calend = cal.CalendarCtrl(self, -1, self.date, #from wx.DateTime_Now()
            style = cal.CAL_SHOW_HOLIDAYS|cal.CAL_SEQUENTIAL_MONTH_SELECTION)
        vbox.Add(self.calend, 0, wx.EXPAND | wx.ALL, 20)

        vbox.Add((-1, 20))

        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        btn = wx.Button(self, wx.ID_OK, 'Ok') #changed id to wx.ID_OK
        cancelBtn = wx.Button(self, wx.ID_CANCEL, 'Cancel') #id to wx.ID_CANCEL
        hbox2.Add(btn, 1)
        hbox2.Add(cancelBtn, 1)
        vbox.Add(hbox2, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 20)

        btn.Bind(wx.EVT_BUTTON, self.okClicked)
        cancelBtn.Bind(wx.EVT_BUTTON, self.OnQuit)

        self.SetSizerAndFit(vbox)

        self.Show(True)
        self.Centre()


    def okClicked(self, event):
        self.date = self.calend.GetDate() #set global value 'date' to selection
        print self.date
        return self.date


#Frame function
def calClick1(self, event):
    calObj = Calendar(None, -1, 'test cal')
    #if you clicked ok, continue...
    if calObj.ShowModal() == wx.ID_OK:
        # Set the TextCtrl by calling the global variable 'calObj.date'
        self.MyTextCtrl.SetValue(calObj.date)

相关问题 更多 >