答案1
您可以在以下设置中执行此操作,这将产生一个半透明的窗口,并停留任意时间:
在任意目录中创建,其中每个用户至少有读权限,为每个用户提供一个消息文件,确切地以每个用户的用户名(登录名)命名,无扩展名,例如
jacob
将文本添加到文件作为消息。如果您添加新的消息,以 开头
###
,然后脚本将自动显示最后一条消息。文本可以包含任何您喜欢的内容,它看起来与您在文件中输入的内容完全一样。这最新的消息,将被复制到
latest_message.txt
用户的主目录以供参考。实际上,窗口会停留 15 秒,但您可以将其设置为任意值,甚至让它自动取决于文本的长度。
示例文件可能如下所示:Vraag: Een aap op een fiets, hoe vind je zoiets? Opdracht: Geef antwoord op de vraag! ### Vraag: Hoe is de koffie vandaag? Opdracht: Zet het zelf even als het niet te drinken is!
该消息将如下所示:
将下面的脚本复制到一个空文件中,在脚本的头部部分编辑存储用户消息的文件夹路径。将脚本保存为
show_personalmessage
(例如)/usr/local/bin
(应该在$PATH
并使其可执行(!)(无延期)#!/usr/bin/env python3 import subprocess import os import gi gi.require_version('Gtk', '3.0') from gi.repository import GObject, Gtk, Gdk, Pango from threading import Thread import time import getpass # --- set the path to the message files below, filename = username filedir = "/home/jacob/Bureaublad" # --- set the time to show the window below showtime = 15 # --- # don't change anything below user = getpass.getuser() currmessage = os.environ["HOME"]+"/latest_message.txt" f = filedir+"/"+user text = "Welcome "+user+"\n\n"+open(f).read().split("###")[-1] open(currmessage, "wt").write(text) class Splash(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="splashtitle") maingrid = Gtk.Grid() self.add(maingrid) maingrid.set_border_width(80) # set text for the spash window label = Gtk.Label(text) label.modify_font(Pango.FontDescription('Ubuntu 12')) maingrid.attach(label, 0, 0, 1, 1) self.stop = Thread(target=self.close_window) self.stop.start() def close_window(self): time.sleep(showtime) Gtk.main_quit() def splashwindow(): window = Splash() window.set_decorated(False) window.set_resizable(False) window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1)) window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("grey")) window.set_opacity(0.8) window.set_position(Gtk.WindowPosition.CENTER) window.show_all() GObject.threads_init() Gtk.main() splashwindow()
在中创建启动器
/etc/xdg/autostart
[Desktop Entry] Type=Application Name=Splash Exec=/bin/bash -c "sleep 10 && show_personalmessage"
sleep 10 是为了确保桌面“准备好”打开窗口。
解释
/etc/xdg/autostart
运行命令中的启动器对于每个用户登录时。- 然后,启动器运行窗口(由命令调用
show_personalmessage
),该窗口在您定义的目录中查找个性化消息。此外,最新消息被复制到用户的主目录中。 - 如果需要,可以更改消息路径,甚至可以使用 -module 将其设置为用户特定的路径
getpass
,以便脚本(窗口)在目录中查找用户特定的命名文件。如果需要,请说明。
此外
(Gtk)窗口
- 可以让它停留在所有事物之下,就像它是背景的一部分一样
- 可以留下来在上面一切
- 可以关闭
等等等等...
编辑
为了节省写消息的时间,正如讨论的那样在聊天中,您可以在脚本的下面包含一些“永久”部分:
premsg
,该内容应位于“欢迎用户 x”和邮件正文的正下方,以及postmsg
,它位于消息的底部。
两个部分都可以设置为无,只需设置""
一个值即可。
剧本
#!/usr/bin/env python3
import subprocess
import os
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GObject, Gtk, Gdk, Pango
from threading import Thread
import time
import getpass
# --- set the path to the message files below, filename = username
filedir = "/path/to/message_directory"
# --- set the time to show the window below
showtime = 15
# --- set pre-message below. set premessage = "" for no pre-message
premsg = """We assume you read all 3782 instruction pages on how to use
Ubuntu before you push any button on this computer.
"""
# --- set post-message below. set postmessage = "" for no post-message
postmsg = """Before you go to sleep tonight, make sure to brush your
teeth for at least half an hour
"""
# --- don't change anything below
user = getpass.getuser()
currmessage = os.environ["HOME"]+"/latest_message.txt"
f = filedir+"/"+user
text = "Welcome "+user+"\n\n"+premsg+"\n"+open(f).read().split("###")[-1]+"\n"+postmsg
open(currmessage, "wt").write(text)
class Splash(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="splashtitle")
maingrid = Gtk.Grid()
self.add(maingrid)
maingrid.set_border_width(80)
# set text for the spash window
label = Gtk.Label(text)
label.modify_font(Pango.FontDescription('Ubuntu 12'))
maingrid.attach(label, 0, 0, 1, 1)
self.stop = Thread(target=self.close_window)
self.stop.start()
def close_window(self):
time.sleep(showtime)
Gtk.main_quit()
def splashwindow():
window = Splash()
window.set_decorated(False)
window.set_resizable(False)
window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("white"))
window.set_opacity(0.8)
window.set_position(Gtk.WindowPosition.CENTER)
window.show_all()
GObject.threads_init()
Gtk.main()
splashwindow()
笔记
当然,就像信息中说的身体,您可以修改脚本以从文件中读取前后消息,这使得维护更加方便。这样做是为了答案的简单性。
答案2
下面的脚本允许管理员将个性化消息以表单形式存储username_mm_dd_yyyy.txt
在管理员定义的目录中。用户名是自动确定的,并与要显示的文件名和日期进行匹配。
脚本还可以有一个.desktop
要放入/etc/xdg/autostart
目录的条目。这将使脚本显示给每个用户。或者,您可以将文件放入.desktop
每个用户的~/.config/autostart
目录中。
#!/bin/bash
_get_username()
{
qdbus com.canonical.Unity \
/com/canonical/Unity/Session \
com.canonical.Unity.Session.UserName
}
_get_date()
{
date +%m_%d_%Y
}
_show_error()
{
MESSAGE="Can't read the file or file doesn't exist. Contact the admin for assistance"
zenity --error --title="Ooops, something went wrong!" --text="$MESSAGE"
}
main()
{
# replace this with the actual directory
# that you want to use for storing messages
MESSAGES_DIRECTORY="/tmp"
# file name is made up of username_mm_dd_yyyy
FILE="$MESSAGES_DIRECTORY"/"$( _get_username )"_"$( _get_date )".txt
echo "$FILE"
if [ -r "$FILE" ] ; then
zenity --text-info --title="Welcome, $( _get_username )" --filename="$FILE"
else
_show_error
fi
}
main
/tmp
下面你可以看到脚本运行的一个小演示。我在我的文件夹中创建了指定格式的文件