2010-11-18 5 views
1

Ich habe eine einfache Server-Anwendung, die ich in Python mit SocketServer gemacht habe, es hat ein sehr primitives Befehlszeilen-Eingabesystem. Mein Hauptproblem hier ist, dass, wenn der Server eine Nachricht empfängt, es auf dem Bildschirm gedruckt wird. Das ist alles in Ordnung und gut, außer dass die Funktion raw_input immer noch darauf wartet, dass Text eingegeben und überprüft wird. Gibt es eine Möglichkeit, in der Server-Funktion handle() den raw_input zu stoppen oder eine Ausnahme auszulösen, die die Eingabe beendet und die Informationen anzeigt, die der Server empfängt?Beenden von raw_input(), wenn anderer Text angezeigt wird

Danke,
Zack.

+1

Warum sind Sie nicht ein GUI-Framework für so etwas? –

Antwort

1

Soweit ich weiß, ist dies nicht möglich, da raw_input Eingaben von der Python-Befehlskonsole akzeptiert. Es gibt jedoch einige Möglichkeiten, um es zu umgehen, die nicht erwartet werden können:

1 - Erstellen Sie ein einfaches Tkinter-Fenster mit dem Ausgang und einer Eingabezeile, anstatt die Konsole zu verwenden. Erstellen Sie eine benutzerdefinierte Druckfunktion, die die Nachricht an das Ende des Fenstertextes anfügt (in einer Bildlaufleiste mit einer Schriftart mit fester Breite) und dann ein Eingabeaufforderungsfeld erstellen kann, das auf Enter reagiert. Der Code für das wäre in etwa so aussehen:

from Tkinter import * 
root = Tk() 
topframe=Frame(root) 
bottomframe=Frame(root) 
bottomframe.pack(side=BOTTOM,fill=X) 
topframe.pack(side=TOP,fill=BOTH) 
scrollbar = Scrollbar(topframe) 
scrollbar.pack(side=RIGHT,fill=Y) 
text = Text(topframe,yscrollcommand=scrollbar.set) 
text.pack(side=LEFT,fill=BOTH) 
scrollbar.config(command=text.yview) 
text.config(state=DISABLED) 
v = StringVar() 
e = Entry(bottomframe,textvariable=v) 
def submit(): 
    command = v.get() 
    v.set('') 
    #your input handling code goes here. 
    wprint(command) 
    #end your input handling 
e.bind('<Return>',submit) 
button=Button(bottomframe,text='RUN',command=submit) 
button.pack(side=RIGHT) 
e.pack(expand=True,side=LEFT,fill=X) 
def wprint(obj): 
    text.config(state=NORMAL) 
    text.insert(END,str(obj)+'\n') 
    text.config(state=DISABLED) 
root.mainloop() 

Eine andere Möglichkeit wäre eine eigene Druck- und raw_input Methoden schaffen so etwas wie folgt aussehen:

import threading 
wlock=threading.Lock() 
printqueue=[] 
rinput=False 
def winput(text): 
    with wlock: 
     global printqueue,rinput 
     rinput=True 
     text = raw_input(text) 
     rinput=False 
     for text in printqueue: 
      print(text) 
     printqueue=[] 
     return text 
def wprint(obj): 
    global printqueue 
    if not(rinput): 
     print(str(obj)) 
    else: 
     printqueue.append(str(obj)) 
Verwandte Themen