Tkinter - Frame: Keine Aktualisierung

Fragen zu Tkinter.
Antworten
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Hallo zusammen,

zur Zeit kämpfe ich mit einem lästigen Problem ...
Aber zuerst ein paar Infos:

Ich habe zwei Python-Programme.
Das Erste öffnet ein Fenster und zeigt den Inhalt einer Datei an.
Das Zweite soll die Datei ändern und dem Ersten mit dem Signal SIGUSR2 darüber informieren.
Dieses soll dann den Inhalt des Fensters aktualisieren.

Klappt auch alles ... mit einer Einschränkung: Die Änderung wird erst sichtbar, wenn ich mit der Maus über das Fenster fahre.

Zur Umgebung: Python 2 auf Arch Linux mit I3

Ach ja: Das erste Programm soll sich bei einem SIGUSR1 beenden ... was erst passiert, wenn ich mit der Maus über das Fenster fahre ...

Hat jemand dazu eine Idee?
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@midan23: Meine Idee wäre: Lass das mit den Signalen sein und nimm etwas anderes zum kommunizieren. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Signale sind etwas Steinzeit und passen zu Python nicht wirklich, und zu GUI-Programmen auch irgendwie nicht. Ideen kann man viele haben, aber ohne den Code zu kennen kann man nur raten, was falsch ist, z.B. dass innerhalb des Signalhandlers die GUI direkt verändert wird.
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Dabei wäre es so einfach ... schliesslich möchte ich die GUI aktualisieren, wenn ein Signal eintrifft (Womit Sirius3 mit seinem Beispiel ins Schwarze getroffen hat)

Scheint aber, das man so etwas nicht machen sollte ...

Was gibt es denn für Alternativen?
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@midan23: Sockets (eventuell mit einer Bibliothek für ein Protokoll (Nanomsg, ZeroMQ, …) oder DBus würden mir da einfallen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

midan23 hat geschrieben: Mittwoch 20. März 2019, 10:00 Was gibt es denn für Alternativen?
Sockets in irgendeiner Form. Und mit https://docs.python.org/2/library/tkint ... ilehandler (gibt's auch fuer Python 3, war nur der erste Link) kannst du benutzen, um auf eingehende Nachrichten zu reagieren. Mache ich mit Erfolg in einigen internen Projekten.
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Danke!!!

Mit Sockets und createfilehandler läufts.

Und damit auch andere was davon haben, hab ich mal meinen Code "etwas reduziert" ... und er ist trotzdem funktionsfähig ;-)
(Dabei sei Angemerkt, das ich mich mit Sockets nicht wirklich auskenne ...)

Code: Alles auswählen

#!/usr/bin/env python2
# coding: UTF-8
#
import os
import socket
import sys
import Tkinter as tk


SOCKETFILE = "/tmp/test-socket"


class Window(tk.Frame):

    def __init__(self, parent=None):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.var = tk.StringVar()
        self.label = tk.Label(self.parent, textvariable=self.var)
        self.label["anchor"] = "w"
        self.label.pack({"side":"top", "fill":"x"})
        self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.socket.bind(SOCKETFILE)
        self.socket.listen(1)
        self.parent.createfilehandler(self.socket, tk.READABLE, self.process_command)

    def process_command(self, in_file, mask):
        conn, addr = in_file.accept()
        result = ""
        while True:
            data = conn.recv(1024)
            if data:
                result += data
            else:
                break
        if result == "quit":
            self.parent.deletefilehandler(self.socket)
            self.socket.close()
            os.unlink(SOCKETFILE)
            self.parent.destroy()
        else:
            self.var.set(result)


def main():
    if len(sys.argv) > 1:
        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        s.connect(SOCKETFILE)
        s.send(sys.argv[1])
        s.close()
    else:
        root = tk.Tk()
        root.resizable(width=False, height=False)
        app = Window(root)
        app.pack()
        root.mainloop()


if __name__ == "__main__":
    main()
Antworten