Skript per Autostart aber im Vordergrund

Fragen zu Tkinter.
Antworten
Sebb
User
Beiträge: 3
Registriert: Dienstag 4. März 2014, 11:25

Hallo

Ich habe ein Skript geschrieben, dass als Erinnerung dienen soll eine Liste zu füllen wenn man das länger nicht gemacht hat.
Es öffnet sich bei Erfüllung der "Alters"-Bedingung ein Fenster mit Text und Button. Wenn man den drückt startet ein subprocess libreoffice mit entsprechender Datei und es erscheint ein zweiter Button, der das ganze dann beendet.
Das funzt auch alles.

Jetzt habe ich das ins autostart gesetzt und es startet auch nach dem Login, ABER ich speicher meine Session, ergo geht (evtl) auch eine Shell auf und die verdeckt mir dann die Erinnerung.

Habs mit
.lift() #Fenster vorne
probiert, aber kein Erfolg. Der Sessionmanager scheint die Fenster erst nach dem Autostart des Skripts zu öffnen. Oder hab ich das falsch geschrieben?

Also folgte ein Versuch mit
.attributes("-topmost", 1) #Fenster "on top"
aber hier ist das Problem, dass dann das Fenster auch immer vor dem Officedokument steht. Das wollte ich nicht.
Hab versucht das mit (-topmost, 0) in der Buttonfunktion zum Öffnen von libreoffice zu beheben

Code: Alles auswählen

    def OPEN():
    #Öffnen der Nutzer-Lliste
        main.attributes("-topmost", 0)
        try:
            t = open(pfad)
        except:
            print"Dateizugriff fehlgeschlagen."
            sys.exit(0)
        subprocess.call(["libreoffice %(p)s" % {"p": pfad}], shell=True)
        #Button END
        bende = Tkinter.Button(main, text = "Erledigt", command = END).pack()
aber das wirkt sich erst nach dem Beenden von libreoffice aus :(


Kann ich das irgendwie mit den Attributen lösen oder muss ich was am Autostart drehen, damit erst die Session wiederhergestellt wird und dann mein Skript gestartet (in der Hoffnung das lift dann funzt)?
Oder gibts ne andere Möglichkeit auf die ich grad nicht komm?

Sebb
Zuletzt geändert von Sebb am Dienstag 4. März 2014, 13:17, insgesamt 2-mal geändert.
BlackJack

Man wird wohl vor dem Start von LibreOffice das Fenster erst ”dauerhaft” nach vorne holen müssen um das dann auch gleich wieder abzuschalten. Ungetestet:

Code: Alles auswählen

    def raise_main_window_to_top(self):
        self.main_window.attributes('-topmost', True)
        self.main_window.update_idletasks()
        self.main_window.attributes('-topmost', False)
        
    def open_libre_office(self):
        self.raise_main_window_to_top()
        if not os.access(os.R_OK | os.W_OK) and os.path.isfile(self.path):
            print 'Dateizugriff fehlgeschlagen.'
            sys.exit(1)
        subprocess.call(['libreoffice', self.path])
        tk.Button(self.main_window, text='Erledigt', command=self.quit).pack()
Sebb
User
Beiträge: 3
Registriert: Dienstag 4. März 2014, 11:25

Wenn ichs richtig verstanden habe ist das ähnlich dem, was ich schon probiert habe.
Beim Erzeugen von main das topmost setzen und dann in der Definition von open wieder wegnehmen ist doch ähnlich, oder? Dann ging topmost aber erst aus, nachdem Libreoffice offen war und wieder geschlossen wurde.
Oder hab ich was in Deinem Code übersehen? Ich mach noch nicht lang Python (2 Wochen)

Du holst es,so wie ich es versteh, auch erst im Kommando open nach vorn, das wär dann aber zu spät, da das tk.Fenster mit dem Button hinter der Shell aus der Session-wiederherstellung ist und man den Button garnicht sieht. Natürlich ist das Fenster in der Taskleiste erreichbar, aber das wäre es auch ohne topmost, lift, etc.
BlackJack

@Sebb: Du hast das `update_idletasks()` übersehen was dafür sorgt, dass die GUI aktualisiert wird.

Was die Startreihenfolge der Programme aus Autostart und Sitzungswiederherstellung angeht, denke ich nicht, dass man da grossartig etwas machen kann.

Man könnte das nach vorne holen vielleicht regelmässig wiederholen bis der Anwender darauf reagiert.

Ich würde ausserdem überlegen einen dafür vorgesehenen Mechanismus zu verwenden, also zum Beispiel eine Benachrichtigung über die Taskleiste.
Sebb
User
Beiträge: 3
Registriert: Dienstag 4. März 2014, 11:25

Ahh...Danke!

Ich hatte noch ne Idee und probier jetzt mal den Autostart einfach mit sleep zu verzögern.
Wenn das nicht klappt probier ich Deinen Vorschlag mit update_idletask.

sleep in der .desktop-Datei hat geholfen. Damit hab ich erstmal das gewünschte Verhalten.
Werd aber in ner ruhigen Minute auf jeden Fall nocht mit update rumprobieren, schon allein aus Interesse wie sich das auswirkt :) Danke Dir
Antworten