У меня двое детей, которые любят Ubuntu так сильно, что они не выполняют свою домашнюю работу по математике. Итак, в духе Монти Пайтона, я хотел бы представить им что-то вроде:
«Стоп. Кто пересечет Мост Смерти, должен ответить на эти три вопроса, прежде чем он увидит ту сторону». [ 111]
при входе в систему.
Им придется решить несколько математических задач, прежде чем они смогут войти в систему.
Мой вопрос: можно ли это сделать?
Следующее тестируется с Ubuntu 13.04 и Python системы, с помощью привязки Gtk (PyGobject).
Вот один путь, немного грязный, хотя и требуется больше расследования:
Сводка
Добавьте a .desktop
файл в /usr/share/xsessions
мы назовем его custom
Добавьте .xsession
файл в рассматриваемом пользователе (Ваши дети) мы назовем их пользователя как kid
Создайте приложение GUI Python для математической загадки и выполните его от .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()
Результаты:
Этому нужно дальнейшее исследование хотя, но я надеюсь, что это помогает как начальная точка.
можно сделать, но потребуется много технических ноу-хау. Самый простой способ сделать это - написать скрипт, который запускается от имени пользователя root:
Возможно, вам понадобится сохранить список математических задач в текстовом файле (или базе данных) и использовать инструменты командной строки imagemagick, чтобы добавить проблему текст на рабочий стол. Используйте cron, чтобы запланировать выполнение этого скрипта так часто (ежедневно?).
Чтобы открыть экран входа в систему для запроса трех разных вопросов, потребуется много пользовательских хакеров, и, вероятно, потребуется замена больших частей вашей системы, поэтому это не рекомендуется. Даже «простой» сценарий, описанный выше, требует больших навыков и знаний, и может привести к поломке вашей системы, если все сделано неправильно.