2013-08-29 15 views
5

mio programma di base importazioni è l'interfaccia grafica da uno script GUI.pyCome reindirizzare stdout a un widget Tkinter Testo

old_stdout = sys.stdout 

root = Tk.Tk() 
root.title('Coursera-dl') 
root.geometry("345x230") 
app = GUI.Interface(root) 
app.mainloop() 

if app.button_press() == True and app.return_data(): 
    data = app.return_data() 
    main(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8]) 

sys.stdout = old_stdout 

Nel mio GUI.py:

class Interface(ttk.Frame): 
    def __init__(self,parent=None): 
     ttk.Frame.__init__(self,parent) 
     self.parent = parent 
     self.New_Window() 

    def New_Window(self): 
     self.newWindow = Tk.Toplevel(self.parent) 
     self.app = CoreGUI(self.newWindow) 


class StdoutRedirector(object): 
    def __init__(self,text_widget): 
     self.text_space = text_widget 

    def write(self,string): 
     self.text_space.insert('end', string) 
     self.text_space.see('end') 


class CoreGUI(object): 
    def __init__(self,parent): 
     self.parent = parent 
     self.InitUI() 

    def InitUI(self): 
     self.text_box = Tk.Text(self.parent, wrap='word', height = 11, width=50) 
     self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5) 
     sys.stdout = StdoutRedirector(self.text_box) 

Ma ciò che fa è apre due finestre e la prima finestra (quella di primo livello) funziona come previsto e il secondo è inattivo, Questo è ciò che è previsto finché non faccio clic su un determinato pulsante che dopo aver premuto stampa i dati in modo continuo ed i dati stampati dovrebbero apparire nella widget di testo della seconda finestra di tuttavia questo non accade e non v'è alcuna risposta dal programma e quando chiudo la finestra di primo livello appare un messaggio di errore

"TclError: invalid command name "".33328904.33329104"""

Quindi, come posso stampare i dati in Text Widget piuttosto che nella console?


EDIT:

Inorder per aiutare ya se alle prese con questo, ho fatto uno script per reindirizzare stdout a un widget Tkinter testo, vedere in azione here :-)

+0

Potrebbe essere utile creare [un esempio breve, autosufficiente e eseguibile] (http://sscce.org/) che mostri il problema. Ci sono molti utenti pigri su SO ([come dovrebbe essere]] (http://c2.com/cgi/wiki?LazinessImpatienceHubris)), quindi più facilmente esegui il debug del tuo programma, più risposte riceverai . – Kevin

risposta

5

Il problema è che quando si chiama app.mainloop(), il thread è occupato nell'esecuzione del mainloop di Tkinter, quindi le istruzioni prima non vengono eseguite finché non si esce dal ciclo. Ma una volta usciti dal mainloop, provate a usare il widget Testo ma è già distrutto.

Vi consiglio di spostare la chiamata a main alla richiamata di un widget Tkinter (suppongo che stiate già provando a farlo con app.button_press()), quindi l'oggetto Testo può essere utilizzato per visualizzare il testo.

class CoreGUI(object): 
    def __init__(self,parent): 
     self.parent = parent 
     self.InitUI() 
     button = Button(self.parent, text="Start", command=self.main) 
     button.grid(column=0, row=1, columnspan=2) 

    def main(self): 
     print('whatever') 

    def InitUI(self): 
     self.text_box = Text(self.parent, wrap='word', height = 11, width=50) 
     self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5) 
     sys.stdout = StdoutRedirector(self.text_box) 


root = Tk() 
gui = CoreGUI(root) 
root.mainloop() 
+2

C'è un modo per reindirizzare lo stdin? – schmi

Problemi correlati