Seite 1 von 1
Tkinter - Frame: Keine Aktualisierung
Verfasst: Dienstag 19. März 2019, 18:05
von midan23
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?
Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Dienstag 19. März 2019, 18:07
von __blackjack__
@midan23: Meine Idee wäre: Lass das mit den Signalen sein und nimm etwas anderes zum kommunizieren.

Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Dienstag 19. März 2019, 21:24
von Sirius3
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.
Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Mittwoch 20. März 2019, 10:00
von midan23
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?
Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Mittwoch 20. März 2019, 10:08
von __blackjack__
@midan23: Sockets (eventuell mit einer Bibliothek für ein Protokoll (Nanomsg, ZeroMQ, …) oder DBus würden mir da einfallen.
Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Mittwoch 20. März 2019, 10:32
von __deets__
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.
Re: Tkinter - Frame: Keine Aktualisierung
Verfasst: Mittwoch 20. März 2019, 13:37
von midan23
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()