问题描述
我有两个孩子非常喜欢Ubuntu,以至于他们没有做数学作业。因此,本着Monty Python的精神,我想向他们介绍以下内容:
“停。谁能越过死亡之桥,就必须回答我这三个问题,他看到的是另一面。”
在登录时。
他们必须先解决一些数学问题,然后才能登录。
我的问题是:可以做这种事情吗?
最佳方法
以下是使用Gtk绑定(PyGobject)在Ubuntu 13.04和系统的Python上进行的测试。
这是一种有点脏的方法,但需要更多调查:
概要
-
在
/usr/share/xsessions
处添加一个.desktop
文件,我们将其命名为custom
-
在有问题的用户(您的孩子)处添加一个
.xsession
文件,我们将其用户命名为kid
-
为数学难题创建Python GUI应用程序并从
.xsession
运行它,我们将其命名为puzzle.py
细节
-
sudo vi /usr/share/xsessions/custom.desktop
在文件中添加以下内容:
[Desktop Entry]
Name=Custom
Comment=This session logs you into your managed desktop environment
Exec=/etc/X11/Xsession
X-Ubuntu-Gettext-Domain=gnome-session-3.0
-
vi /home/kid/.xsession
在文件中添加以下内容:
#!/bin/bash
lightdm &
exec /home/kid/puzzle.py
-
vi /home/kid/puzzle.py
在文件中添加以下内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import random
from gi.repository import Gtk
#----------------------------------------------------------------------
class PuzzleWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Math Puzzle", resizable=False)
super(PuzzleWindow, self).set_position(Gtk.WindowPosition.CENTER)
super(PuzzleWindow, self).maximize()
self.a_number = random.randint(1, 5)
self.b_number = random.randint(1, 5)
self.result = self.a_number + self.b_number
self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
self.label = Gtk.Label("What is the sum of the numbers bellow?")
self.number_label = Gtk.Label("{num_a} + {num_b}".format(
num_a=self.a_number, num_b=self.b_number))
self.entry = Gtk.Entry()
self.button = Gtk.Button(label="Check answer!")
self.button.connect("clicked", self.on_button_clicked)
self.vbox.pack_start(self.label, True, True, 0)
self.vbox.pack_start(self.number_label, True, True, 0)
self.vbox.pack_start(self.entry, True, True, 0)
self.vbox.pack_start(self.button, True, True, 0)
self.add(self.vbox)
def on_button_clicked(self, widget):
if int(self.entry.get_text()) == self.result:
subprocess.call("unity &", shell=True)
else:
self.label.set_text("Wrong answer, try again.")
#----------------------------------------------------------------------
def main():
"""Application's entry point"""
win = PuzzleWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
if __name__ == "__main__":
main()
结果:
-
如果注销,则在登录屏幕上将看到一个名为Custom的新会话。
-
通过选择自定义会话并成功登录后,您将看到一个小的PyGtk(使用pygobject)窗口,询问数学难题。没有顶部栏,启动器和其他默认桌面小部件:
-
如果您回答正确,Unity将加载…
尽管它需要进一步的研究,但是我希望它可以作为一个起点。
次佳方法
可以做到,但是需要很多技术知识。编写作为root用户运行的脚本的最简单方法是:
-
自动将其密码更改为给定问题的答案,
-
更改其桌面墙纸以显示他们试图回答的问题
您可能需要将数学问题列表保存在文本文件(或数据库)中,并使用imagemagick命令行工具将问题文本添加到桌面墙纸中。使用cron安排该脚本每隔一段时间(每天?)运行一次。
要使登录屏幕询问3个不同的问题,将需要进行大量的自定义黑客操作,并且可能涉及更换系统的大部分内容,因此不建议这样做。即使上面的”simple”脚本也需要大量的技能和知识,并且如果操作不当,可能会破坏系统。