2014-12-02 103 views
0

我有一個用wxPython創建的中型桌面應用程序。我想在這個應用程序中實現一個session工具。經過一段時間的不活動之後,應用程序應該將用戶註銷並自動顯示登錄屏幕。在wxPython中完成此操作的最佳方法是什麼?wxPython會話超時

該應用在Windows 8, 7, XP內使用wxPython 2.8.12.1Python 2.7

編輯1

綁定EVT_MOTIONwx.Framewx.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 2014-12-02 17:25:09

+0

我只會將EVT_MOTION事件綁定到框架或頂層面板。這應該適用於大多數情況,因爲我希望用戶在使用應用程序的過程中移動鼠標。大多數超時至少5分鐘,通常10或15,所以這真的不應該是一個問題。 – 2014-12-02 17:32:18

+0

謝謝,我會試試看,並會讓你知道結果:) – arvinchhi 2014-12-03 04:34:36