Wie setzt man einen Programm-Schliesser um?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Hi Leute,

Ich suche einfach nach einer möglichst allgemeinen Lösung, während das Programm mit subprocess
gestartet wurde mitzubekommen, welche Tasten gedrückt wurden und je nach dem das Programm zu
schliessen, muss also keineswegs pygame sein.
Ich dachte an sowas wie das folgende, aber das Programm reagiert in keinster Weise -.- :

Code: Alles auswählen

#!/usr/bin/python

## Program-Closer

import pygame
import subprocess

PROGRAM_PATH = "/usr/games/blobby"

def main():
    pygame.init()
    pygame.key.set_repeat(1, 30)
    proc = subprocess.Popen(PROGRAM_PATH)
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                proc.kill()
                running = False
            if event.type == KEYDOWN:
                pygame.event.post(pygame.event.Event(QUIT))
    
if __name__ == "__main__":
    main()
Lg, Jonas :wink:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Wenn ich richtig liege, erreichst du das nur, wenn du dich direkt an den jeweiligen "Keypress / Window Manager" dranklemmst - unter GNU/Linux ist das meist Xorg. Ich habe (ohne wirklich Ahnung von Xorg / Xlib etc zu haben) schnell das folgende in C zusammengeschrieben:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
#include <sys/types.h>

#include <X11/Xlib.h>
#include <X11/keysym.h>

#define PROGRAM_INVOKATION "/usr/games/solarwolf"

void
enter_quit_searching_loop(Display *display /* , pid_t pid */) {
	XEvent e;
	KeySym k;

	while(true) {
		XNextEvent(display, &e);

		if(e.type == KeyPress) {
			k = XKeycodeToKeysym(display, e.xkey.keycode, 0);

			/* Add the necessary stuff here */
			if(k == XK_Escape) {
				/* kill(pid, SIGINT); */
				return;
			}
		}
	}
}

int
main(void) {
	Display *display;
	FILE *program_fp;

	if((display = XOpenDisplay(NULL)) == NULL) goto out;
	if((program_fp = popen(PROGRAM_INVOKATION, "r")) == NULL) goto out_2;

	enter_quit_searching_loop(display);

	pclose(program_fp);
	out_2:
	XCloseDisplay(display);
	out:
	return EXIT_SUCCESS;
}
Kompilieren mit -lX11. Das funktioniert so nicht, entspricht aber in etwa deinem Prinzip - vielleicht kann jemand mit mehr Ahnung von Xlib hier weiterhelfen, und vielleicht gibt es auch eine Python Anbindung an Xlib. Wie gesagt, wenn ich richtig liege und man mit Xlib diese Ereignisse allgemein abfangen kann. Was für ein Problem willst du denn überhaupt lösen, warum brauchst du diese allgemeine Möglichkeit, ein Programm zu beenden? Und dieses Beenden müsste hier sowieso mittels kill() / KeyboardInterrupt erreicht werden, was bei vielen Programmen nicht die feine Art ist.

ADD: Die C Quelltexteinbettung wandelt & in & um.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

subprocess unterstützt ja auch die Kommunikation dem dem gestarteten Programm via stdin/stdout (Pipes). Wenn das Prog als die die Tastendrücke via stdout ausgibt, kannst du sie dir auch holen (geht auch andersrum, also via stdin senden).

Siehe http://docs.python.org/library/subprocess.html

Gruß, noisefloor
Antworten