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?
Tkinter - Frame: Keine Aktualisierung
- __blackjack__
- User
- Beiträge: 13111
- 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
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.
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?
Scheint aber, das man so etwas nicht machen sollte ...
Was gibt es denn für Alternativen?
- __blackjack__
- User
- Beiträge: 13111
- 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
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.
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 ...)
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()