2013-08-29 19 views
5

Moi import programu baza to interfejs GUI ze skryptu GUI.pyjak przekierować stdout do widgetu Tekst Tkinter

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 

W moim 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) 

Ale co robi to otwiera dwa okna i pierwsze okno (pierwszy poziom) działa zgodnie z oczekiwaniami, a drugie to bezczynne, To jest oczekiwane, dopóki nie kliknę konkretnego przycisku, które po naciśnięciu dane drukuje w sposób ciągły i dane drukowane powinny pojawić się w widgecie tekstowym drugim oknie za jednak tak się nie dzieje i nie ma odpowiedzi z programu i kiedy zamknąć Toplevel okno pojawia się komunikat o błędzie

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

Więc jak mogę wydrukować dane w Widgecie tekstowym, a nie w konsoli?


EDIT:

Inorder pomóc ya jeśli zmaga się z tym, zrobiłem skrypt, aby przekierować stdout do widgetu Tekst Tkinter, widzieć go w akcji here :-)

+0

Może Ci pomóc stworzyć [krótki, samodzielny, działający przykład] (http://sscce.org/), który demonstruje twój problem. Na SO jest dużo leniwych użytkowników ([jak powinno być] (http://c2.com/cgi/wiki?LazinessImpatienceHubris)), więc im łatwiejsze będzie wykonanie debugowania programu, tym więcej otrzymasz odpowiedzi . – Kevin

Odpowiedz

5

Problem polega na tym, że podczas wywoływania app.mainloop() wątek jest zajęty wykonywaniem pętli głównej Tkintera, więc instrukcje przed nią nie są wykonywane, dopóki nie opuścisz pętli. Ale po wyjściu z pętli, próbujesz użyć widżetu Tekst, ale jest on już zniszczony.

Polecam przeniesienie wywołania do main do wywołania zwrotnego widgetu Tkinter (przypuszczam, że już próbujesz to zrobić z app.button_press()), więc obiekt Tekst może być używany do wyświetlania tekstu.

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

Czy istnieje sposób przekierowania wejścia standardowego? – schmi

Powiązane problemy