จะสร้างตัวเรียกใช้งานแบบรวมที่ตรวจสอบไฟล์ได้อย่างไร


11

ฉันต้องการสร้างตัวเรียกใช้งานที่ทำเช่นเดียวกับไอคอนถังขยะที่มีรายการด่วนที่แตกต่างกันแสดงขึ้นอยู่กับว่ามีรายการในถังขยะหรือไม่

ฉันต้องการบางสิ่งเช่น: หากAมีโฟลเดอร์อยู่แสดงA,B,Cในรายการด่วนหากAไม่มีโฟลเดอร์อยู่ให้แสดงD,E,Fในรายการด่วน


3
ฉันได้มองเข้าไปในนี้มาก่อนและมีอาจจะต้องทำผ่านโปรโตคอลประกาศการเริ่มต้น และโดยการตั้งค่า StartupNotify ให้เป็นจริงในไฟล์ .desktop แต่ฉันไม่แน่ใจจากที่นั่น
Paul van Schayck

1
ลองดู: wiki.ubuntu.com/Unity/LauncherAPIมีตัวอย่างของรายการลัดแบบไดนามิก
S Prasanth

คำตอบ:


3

ผลงานดังต่อไปนี้:

  1. สร้าง 2 ไฟล์: mylauncher.desktop และ mylauncher.py พร้อมเนื้อหาตามที่ระบุด้านล่าง
  2. ทำให้ mylauncher.desktop เป็นไฟล์ปฏิบัติการ
  3. เพิ่ม mylauncher.desktop ไปที่ launcher ของ unity
  4. แก้ไขชื่อโฟลเดอร์และโฟลเดอร์ใน mylauncher.py ตามความจำเป็น
  5. ทำงานpython mylauncher.pyในพื้นหลัง คุณจะต้องเพิ่มสิ่งนี้ในสคริปต์เริ่มต้นของคุณ

ที่มา: https://wiki.ubuntu.com/Unity/LauncherAPI


เนื้อหาของ mylauncher.desktop:

[Desktop Entry]
Name=My Launcher
Comment=A,B,C if A else D,E,F
Exec=nautilus %U
Icon=nautilus
Terminal=false
StartupNotify=true
Type=Application
OnlyShowIn=GNOME;Unity;
Actions=;

เนื้อหาของ mylauncher.py:

updateinterval = 1 #Update interval in seconds. Set it to a +ve integer.
#In Foldernames and Folderlocations, spaces shouldn't be preceded by \.
Foldernames = ["A", "B", "C", "D", "E", "F"]
Folderlocations = ["/home/prasanth/A", "/home/prasanth/B", "/home/prasanth/C", "/home/prasanth/D", "/home/prasanth/E", "/home/prasanth/F"]
#####################################

from gi.repository import Unity, Gio, GObject, Dbusmenu
import os, subprocess

def nautilusopen(junk1, junk2, location): #Function that opens `location` in nautilus. Equivalent to `nautilus location` in bash.
    subprocess.Popen(['nautilus', "%s" % location])

launcher = Unity.LauncherEntry.get_for_desktop_id("mylauncher.desktop") #You won't have to modify this, except if you rename `mylauncher.desktop`

#Code block A: This code block builds 6 quicklist entries, 3 for when A is found and 3 for when it isn't
QLentries = [Dbusmenu.Menuitem.new() for i in Foldernames]
for i in xrange(6):
    QLentries[i].property_set(Dbusmenu.MENUITEM_PROP_LABEL, "Goto %s" % Foldernames[i])
    QLentries[i].connect("item-activated", nautilusopen, Folderlocations[i])
    QLentries[i].property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
################

#Code block B: This code block creates 2 quicklists 1 for when A is found and 1 for when it isn't. Then it adds the first 3 quicklist entries to QLifA and the next 3 to QLifnotA
QLifA = Dbusmenu.Menuitem.new() #Quicklist if A is found
QLifnotA = Dbusmenu.Menuitem.new() #Quicklist if A is not found.
for i in xrange(3):
    QLifA.child_append(QLentries[i])
for i in xrange(3, 6):
    QLifnotA.child_append(QLentries[i])
################

#The rest of the code simply monitors the file system for A's existence and switches appropriately between QLifA and QLifnotA
prevState = None
def updateql():
    global prevState
    currentState = 'A' if os.path.exists(Folderlocations[0]) else 'notA' #currentState is 'A' if Folderlocations[0] (which is /home/prasanth/A) exists, 'notA' otherwise
    if currentState != prevState:
        if currentState == 'A':
            launcher.set_property("quicklist", QLifA)
        else:
            launcher.set_property("quicklist", QLifnotA)
        prevState = currentState
    return True

#GObject.timeout_add_seconds(updateinterval, updateql)
#mainloop = GObject.MainLoop()
#mainloop.run()

#If the 3-line commented block above worked as expected, the remainder of this script would be unnecessary. Unfortunately, it doesn't.
import signal
def alarmhandler(signum, frame):
    raise Exception('Alarm has rung')
signal.signal(signal.SIGALRM, alarmhandler)

mainloop = GObject.MainLoop()

while True:
    try:
        updateql()
        signal.alarm(updateinterval)
        mainloop.run()
    except KeyboardInterrupt:
        continue

แก้ไข: ใช้ต่อไปนี้เป็น mylauncher.py สำหรับจุดประสงค์ที่ระบุไว้ในความคิดเห็น การปรับเปลี่ยนให้เหมาะสมกับความต้องการของคุณควรตรงไปตรงมาและในกรณีที่ไม่ได้กล่าวถึงในความคิดเห็น

from gi.repository import Unity, Gio, GObject, Dbusmenu
import os, subprocess

updateinterval = 1 #Update interval in seconds. Set it to a +ve integer.

#Quicklist entries if already mounted:
ifMountedEntry1text = """Unmount A""" #Text shown in the quicklist menu for this entry.
ifMountedEntry1command = """unmount A""" #Bash command to execute when entry 1 is clicked. Doubt if `unmount A` will work. Modify appropriately.

ifMountedEntry2text = """Open A""" #Maybe you'll want to open A directly from the launcher. Included just so you get a hang of how this works.
ifMountedEntry2command = """nautilus A"""
#Extend as required.

#Quicklist entries if not already mounted:
ifnotMountedEntry1text = """Mount A"""
ifnotMountedEntry1command = """mount A""" #Again modify `mount A` appropriately.
#Extend as required.

#My old file monitoring should work. But in case you want to change the criteria for modifying quicklists, it is better to do the following:
filemonitoringcommand = """if [ -d /folder/to/monitor/ ]; then echo True; else echo False; fi;""" #<Bash command>/<location to script> which prints 'True' if A is mounted, 'False' otherwise.
#####################

def systemcall(junk1, junk2, command):
    os.system(command)

launcher = Unity.LauncherEntry.get_for_desktop_id("mylauncher.desktop") #You won't have to modify this, except if you rename `mylauncher.desktop`

#Quicklist if already mounted:
QLifMounted = Dbusmenu.Menuitem.new()

ifMountedEntry1 = Dbusmenu.Menuitem.new()
ifMountedEntry1.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifMountedEntry1text) #Sets the text shown in the quicklist menu for this entry.
ifMountedEntry1.connect("item-activated", systemcall, ifMountedEntry1command) #Sets the corresponding bash command.
ifMountedEntry1.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifMounted.child_append(ifMountedEntry1) #Adds the first entry to the quicklist

ifMountedEntry2 = Dbusmenu.Menuitem.new()
ifMountedEntry2.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifMountedEntry2text)
ifMountedEntry2.connect("item-activated", systemcall, ifMountedEntry2command)
ifMountedEntry2.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifMounted.child_append(ifMountedEntry2)
#Extend as required.

#Quicklist if not already mounted:
QLifnotMounted = Dbusmenu.Menuitem.new()

ifnotMountedEntry1 = Dbusmenu.Menuitem.new()
ifnotMountedEntry1.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifnotMountedEntry1text)
ifnotMountedEntry1.connect("item-activated", systemcall, ifnotMountedEntry1command)
ifnotMountedEntry1.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifnotMounted.child_append(ifnotMountedEntry1)
#Extend as required.

#The rest of the code uses `filemonitoringcommand` to monitor the filesystem and dynamically modifies (or rather switches between) quicklists.
prevState = None
def updateql():
    global prevState
    currentState = 'True' in os.popen(filemonitoringcommand).read()
    if currentState != prevState:
        if currentState == True:
            launcher.set_property("quicklist", QLifMounted) #If already mounted, sets QLifMounted as the quicklist.
        else:
            launcher.set_property("quicklist", QLifnotMounted) #Otherwise sets QLifnotMounted as the quicklist.
        prevState = currentState
    return True

#GObject.timeout_add_seconds(updateinterval, updateql)
#mainloop = GObject.MainLoop()
#mainloop.run()

#If the 3-line commented block above worked as expected, the remainder of this script would be unnecessary. Unfortunately, it doesn't.
import signal
def alarmhandler(signum, frame):
    raise Exception('Alarm has rung')
signal.signal(signal.SIGALRM, alarmhandler)

mainloop = GObject.MainLoop()

while True:
    try:
        updateql()
        signal.alarm(updateinterval)
        mainloop.run()
    except KeyboardInterrupt:
        continue

ฉันได้ลองแล้ว แต่มันใช้ไม่ได้สำหรับฉัน รายการด่วนไม่เปลี่ยนแปลง ฉันใช้ Ubuntu 12.10 64- บิต
Rey Leonard Amorato

ฉันใช้ 12.04 32 บิต สคริปต์ python ควรรันหลังจากเพิ่มไอคอนตัวเรียกใช้ไปยังตัวเรียกใช้งาน
S Prasanth

ทำสิ่งต่อไปนี้ 1) ใส่ mylauncher.desktop ใน ~ / .local / share / applications 2) กดปุ่ม super-key และค้นหา 'My Launcher' 3) ลากไอคอนตัวเรียกใช้ที่ปรากฏบนตัวปล่อยความสามัคคี 4) เรียกใช้สคริปต์หลาม สิ่งนี้น่าจะใช้ได้
S Prasanth

@ReyLeonardAmorato ฉันแค่อยากรู้อยากเห็น มันใช้งานได้หรือ
S Prasanth

สวัสดี ขออภัยฉันไม่สามารถหาเวลาที่จะออนไลน์เมื่อเร็ว ๆ นี้ แต่วิธีการล่าสุดของคุณใช้ได้สำหรับฉัน อย่างไรก็ตามสิ่งที่ฉันต้องการแตกต่างจากสคริปต์เล็กน้อย ฉันต้องการตรวจสอบตำแหน่งโฟลเดอร์ (สคริปต์ทำสิ่งนี้แล้ว) และหากโฟลเดอร์ 'A' มีอยู่ให้แสดง 'unmount' ในรายการด่วน แสดง 'mount' เป็นอย่างอื่น ฉันไม่มีความรู้เกี่ยวกับสคริปต์ python ดังนั้นฉันจึงไม่รู้ว่าจะแก้ไขสคริปต์ที่คุณให้ไว้อย่างไร มันจะดีถ้าคุณสามารถช่วยด้วยบิตสุดท้ายนี้
Rey Leonard Amorato
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.