2014-12-02 4 views
0

У меня есть настольное приложение среднего размера, созданное с помощью wxPython. Я хочу реализовать объект session в этом приложении. После некоторого времени бездействия приложение должно автоматически вывести пользователя из системы и отобразить экран входа в систему. Каким будет лучший способ сделать это в wxPython?wxPython session timeout

Приложение использует wxPython 2.8.12.1 с Python 2.7 в пределах Windows 8, 7, XP.

EDIT 1

Связывание EVT_MOTION с wx.Frame и wx.Panel не работает. Он работает, если я связываю EVT_MOTION со всеми отдельными объектами. Есть ли способ получить событие, вырвавшееся из внешнего родителя (wx.Frame)?

import wx 

class MyFrame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Checking EVT_MOTION with Frame") 

     panel = wx.Panel(self, -1) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     panel.SetSizer(sizer) 

     sizer.Add(wx.Button(panel, -1, "Button 1"), 1, wx.EXPAND) 
     sizer.Add(wx.Button(panel, -1, "Button 2"), 1, wx.EXPAND) 
     sizer.Add(wx.Button(panel, -1, "Button 3"), 1, wx.EXPAND) 

     self.Bind(event=wx.EVT_MOTION, handler=self.OnMotion) 

     self.Show() 

    def OnMotion(self, event): 
     print "EVT_MOTION: " + str(event.GetEventObject()) 


if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

ответ

0

Я бы использовал wx.Timer. Вы можете перезапустить его каждый раз, когда пользователь перемещает мышь (wx.EVT_MOTION) или нажимает клавишу (wx.EVT_KEY_DOWN). Я написал руководство по использованию wx.Timers, которые могут оказаться полезными:

Вот один из примеров из этого учебника, который реализует супер простой wx.Timer:

import wx 
import time 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Timer Tutorial 1", 
            size=(500,500)) 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.update, self.timer) 

     self.toggleBtn = wx.Button(panel, wx.ID_ANY, "Start") 
     self.toggleBtn.Bind(wx.EVT_BUTTON, self.onToggle) 

    def onToggle(self, event): 
     btnLabel = self.toggleBtn.GetLabel() 
     if btnLabel == "Start": 
      print "starting timer..." 
      self.timer.Start(1000) 
      self.toggleBtn.SetLabel("Stop") 
     else: 
      print "timer stopped!" 
      self.timer.Stop() 
      self.toggleBtn.SetLabel("Start") 

    def update(self, event): 
     print "\nupdated: ", 
     print time.ctime() 

# Run the program 
if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = MyForm().Show() 
    app.MainLoop() 
+0

У меня есть много панелей с множеством кнопок и других элементов управления. Большинство из них уже связаны с некоторыми событиями. Как я могу достичь этого, не добавляя код таймера для событий каждого элемента управления? Будет ли он работать, если я напрямую свяжу ключевое слово и нажав события на самый внешний кадр? Но снова у меня есть некоторые элементы управления, которые останавливают распространение событий. – arvinchhi

+0

Я бы просто привязал событие EVT_MOTION к панели кадра или верхнего уровня. Это должно работать для большинства вещей, так как я ожидаю, что пользователь будет перемещать мышь во время использования приложения. Большинство тайм-аутов составляют не менее 5 минут и обычно 10 или 15, поэтому это действительно не должно быть проблемой. –

+0

Спасибо, я попробую его и дам вам знать результаты :) – arvinchhi