如何在Ubuntu(最好是Windows)中启动一个接受键盘输入的Python屏保?
我正在用Python开发一个小应用,主要是为了在家里使用。这个应用的功能是作为一个幻灯片屏幕保护程序,同时也能当作一个简单的图片管理器。我已经搞定了幻灯片和图片管理的部分(我用的是Tkinter),但屏幕保护程序的功能还没实现。目前从命令行启动这个应用是没问题的。
我在用Ubuntu系统,因为我需要这个应用能接受键盘输入,所以我觉得不能用xscreensaver或gnome-screensaver框架,因为它们会捕捉所有输入并显示登录对话框。我希望我错了(毕竟这么多年后能重新用xscreensaver也不错 :))。
我想到的解决办法是用PyXSS来检测用户是否闲置,然后自己管理屏幕保护程序的部分。不过,最好能找到一个不依赖平台的解决方案,因为我想把这个程序分享给一些使用Windows的朋友。
接下来是我的问题:
我能否以某种方式使用xscreensaver来启动我的程序,但又避免xscreensaver对键盘的处理?
有没有不依赖平台的替代方案来替代PyXSS?
我该如何在Windows上实现相同的功能?
2 个回答
嗯,首先有一个叫做pyhack的东西,它可以让你在Mac和Linux上使用xscreensaver。关于pyhack模块我不太确定,但xscreensaverhack可以让你捕捉键盘和鼠标的操作。
我听说可能有一个用于Windows屏幕保护程序编程的Python库。即使没有这样的库,你也可以使用win32api,这个是win32 Python包自带的。网上有很多教程会告诉你该调用哪些api函数来制作屏幕保护程序。至于使用pyopengl之类的东西,我就不太清楚了……
对于Windows系统,你可以创建一个可执行文件(比如用py2exe
),然后把它的后缀从.exe
改成.scr
。
接着,你可以右键点击这个文件,选择“安装”,或者直接把它复制到你的Windows/System32目录下,这样它就会出现在屏幕保护程序的列表里!
不过有一点需要注意:我觉得最好只创建一个可执行文件,而不是一堆文件(也就是依赖文件)。
我使用这个设置配置(针对py2exe
)来创建一个单独的可执行文件:
from distutils.core import setup
import py2exe
includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
'Tkconstants', 'Tkinter','MSVCP90.dll']
packages = []
dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll',
'tk84.dll']
setup(
options = {"py2exe": {"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"dll_excludes": dll_excludes,
"bundle_files": 1,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
},
zipfile = None,
windows=['main.py'] # <- the name of your code file
)
补充说明:要编译成功,你需要把MSVCP90.dll文件放在同一个文件夹里。如果你在电脑上找不到这个文件,可以用谷歌搜索一下!
命令行参数:根据不同的情况(预览、设置等),会有几个命令行参数。你可以在这里找到一个列表: http://www.wikihow.com/Convert-an-Executable-File-Into-a-Screensaver
可惜那里的内容并不完全正确,简单来说:
- /s 和 /S ... 当屏幕保护程序启动时(其中一个是在预览时使用)
- /c:# ... 当按下配置按钮时。最好只用前两个字符,比如
if sys.argv[1][:2]=='/c':
这样就很好用。 - /p # ... 会被调用多次(比如关闭配置后,或者预览结束后等),每次都会返回到一般的屏幕保护程序设置。我就把这个和其他可能性(除了/s、/S或/c:#)都丢掉了。这样也没问题!
用户输入:处理键盘输入其实很简单,因为它不会因为鼠标移动或键盘事件自动退出,但你需要自己实现这些方法!所以别忘了写你的“on_mouse_event_close_program”函数哦!