Giriş yapmadan önce bana bu soruları cevaplamalısın 3?


22

Ubuntu'yu o kadar çok seven iki çocuğum var ki matematik ödevlerini yapmıyorlar. Bu yüzden Monty Python'un ruhunda, onlara şöyle bir şey sunmak istiyorum:

“Dur. Ölüm Köprüsünü kim geçecek bana bu soruları cevaplamalı, üç tarafı da görmeli.”

giriş sırasında.

Giriş yapmadan önce birkaç matematik problemini çözmek zorunda kalacaklardı.

Sorum şu: bu tür bir şey yapılabilir mi?


Bunu kendi xscreensaver modülümü yazarak yapabilir miyim? Ya da belki / etc / profile ekleyin?
user187493

1
Kendi Takılabilir Kimlik Doğrulama Modülünüzü (PAM) yazmayı ve bunu lightdm selamlayıcı ile nasıl entegre edeceğinizi de düşünebilirsiniz.
ImaginaryRobots

Teşekkürler tam olarak bu benim aradığım bir tavsiye. :) Sistemimi kırmaktan korkmuyorum. Anladığım kadarıyla bir şeyi kırmıyorsam doğru yapmıyorum.
user187493

Yanıtlar:


30

Aşağıdakiler, Ubuntu 13.04 ve sistem Python ile Gtk bağlamaları (PyGobject) kullanılarak test edilmiştir.

İşte yine de biraz kirli bir yol ve daha fazla araştırmaya ihtiyacı var:

özet

  • Adını bir .desktopdosya /usr/share/xsessionsekleyelimcustom

  • .xsessionSöz konusu kullanıcıya bir dosya ekle (çocuklarınız) kullanıcılarını şu şekilde adlandırırız:kid

  • Matematik bulmacası için Python GUI uygulamasını oluşturun ve çalıştırın .xsession.puzzle.py

ayrıntılar

  • sudo vi /usr/share/xsessions/custom.desktop

Aşağıdakileri dosyaya ekleyin:

[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

Aşağıdakileri dosyaya ekleyin:

#!/bin/bash
lightdm &
exec /home/kid/puzzle.py
  • vi /home/kid/puzzle.py

Aşağıdakileri dosyaya ekleyin:

#!/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()

Sonuçlar:

  • Çıkış yaparsanız, giriş ekranında Özel adında yeni bir oturum göreceksiniz.
  • Özel oturumu seçerek ve başarılı bir giriş yaptıktan sonra, matematik bulmacasını isteyen küçük bir PyGtk (pygobject kullanarak) penceresi açacaksınız. Üst çubuk, başlatıcı ve varsayılan masaüstü widget'larının geri kalanı olmayacak:

Birliğe özel erişim

  • Doğru cevap verirseniz, Unity yüklenir ...

Yine de daha fazla araştırmaya ihtiyacı var ama umarım bir başlangıç ​​noktası olarak yardımcı olur.


@ user187493 Sorununuzun çözüldüğünü düşünüyorsanız, cevabı kabul edin.
Stef K,

Metin tabanlı bir çözüme aldırış etmezseniz, birkaç soru soran ve cevapları kontrol eden basit bir kabuk betiği yazamazsınız. Cevaplar doğruysa, o zaman bir başlangıç ​​yapın, aksi halde çıkış yapın. Ardından, / etc / passwd dosyasını düzenleyin ve bu betiği kendi giriş kabuğu yapın. Yukarıdaki çözümden daha az zarif, ancak kodlaması ve bakımı çok daha kolay. Aynı zamanda göreceli olarak dağıtılmış / masaüstü bağımsız olmalıdır. Ayrıca sigint (Ctrl_C) gibi şeyleri incelikle ele aldığından emin olmak için test etmeniz gerekir.
Joe,

Çok hoş! bu gerçekten sevdiğim şeyler.
Jacob Vlijm

3

Bu olabilir yapılabilir, ancak teknik bilgi kendini çok alacaktı. Bunu root olarak çalıştırılan bir script yazarak yapmanın en basit yolu:

  • şifrelerini belirli bir sorunun cevabına göre otomatik olarak değiştirir,
  • yanıtlamaya çalıştıkları soruyu göstermek için masaüstü duvar kağıdını değiştirir

Matematik problemlerinin listesini bir metin dosyasında (veya veritabanında) saklamanız ve problem metnini masaüstü duvar kağıdına eklemek için imagemagick komut satırı araçlarını kullanmanız gerekebilir. Bu betiği sık sık çalıştırmak üzere programlamak için cron kullanın (günlük?).

3 farklı soru sormak için oturum açma ekranını almak çok fazla özel bilgisayar korsanlığı gerektirecek ve muhtemelen sisteminizin büyük bölümlerinin değiştirilmesini gerektirecek, bu yüzden önerilmez. Yukarıdaki "basit" senaryo bile çok fazla bilgi ve beceri gerektirir ve yanlış yapıldığında sisteminizi potansiyel olarak bozabilir.


Cevabınız için teşekkürler. Mini bir soru ve cevap veritabanını kullanacaktım ve imagemagik kullanma fikrini çok beğendim.
user187493
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.