로그인하기 전에이 질문들에 답해야합니다 3? 우분투를 너무 좋아하는 두

나는 수학 숙제를하지 않도록 우분투를 너무 좋아하는 두 아이가 있습니다. Monty Python의 정신으로 다음과 같은 것을 제시하고 싶습니다.

“중지하십시오. 죽음의 다리를 건너는 사람은 저에게 보이는 세 가지 질문에 답해야합니다.”

로그인 할 때

로그인하기 전에 몇 가지 수학 문제를 해결해야합니다.

내 질문은 :이 유형의 일을 할 수 있습니까?



답변

다음은 Gtk 바인딩 (PyGobject)을 사용하여 Ubuntu 13.04 및 시스템의 Python에서 테스트되었습니다.

조금 더러운 방법이 있지만 여기에 더 많은 조사가 필요합니다.

개요

  • 이름 .desktop/usr/share/xsessions지정할 파일을 추가하십시오.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 가로 드됩니다 …

추가 연구가 필요하지만 시작점으로 도움이되기를 바랍니다.


답변

할 수 있지만, 기술적 인 노하우를 많이 걸릴 것이다. 루트로 실행되는 스크립트를 작성하여이를 수행하는 가장 간단한 방법은 다음과 같습니다.

  • 주어진 질문에 대한 답변으로 비밀번호를 자동 변경합니다.
  • 그들이 답변하려고하는 질문을 표시하기 위해 바탕 화면 배경 무늬를 변경

수학 문제 목록을 텍스트 파일 (또는 데이터베이스)로 유지하고 imagemagick 명령 줄 도구를 사용하여 문제 텍스트를 데스크탑 배경 무늬에 추가해야합니다. cron을 사용하여 스크립트가 너무 자주 실행되도록 예약하십시오 (매일?).

로그인 화면에 3 가지 다른 질문을하려면 많은 사용자 지정 해킹 이 필요하며 시스템의 많은 부분을 교체해야 할 수 있으므로 권장하지 않습니다. 위의 “간단한”스크립트조차 많은 기술과 지식이 필요하며 잘못 수행하면 시스템이 손상 될 수 있습니다.