2013-08-29 49 views
5

My chương trình cơ sở nhập khẩu đó là giao diện GUI từ một kịch bản GUI.pyLàm thế nào để chuyển hướng stdout để Text Widget 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 

Trong GUI.py tôi:

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) 

Nhưng những gì nó làm là nó mở ra hai cửa sổ và cửa sổ đầu tiên (cái toplevel) hoạt động như mong đợi và thứ hai là nhàn rỗi, Đây là những gì được mong đợi cho đến khi tôi bấm vào một nút nhất định mà sau khi nhấn dữ liệu in liên tục và dữ liệu được in sẽ xuất hiện trong tiện ích văn bản của cửa sổ thứ hai tuy nhiên điều này không xảy ra và không có phản hồi từ chương trình và khi tôi đóng cửa sổ Toplevel, thông báo lỗi xuất hiện

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

Vậy làm cách nào để in dữ liệu trong Tiện ích văn bản thay vì trong bảng điều khiển?


EDIT:

Inorder để giúp ya'll nếu bạn đang gặp khó khăn với điều này, tôi đã thực hiện một kịch bản để chuyển hướng stdout để Text Widget Tkinter, nhìn thấy nó trong hành động here :-)

+0

Nó có thể giúp bạn tạo [ví dụ ngắn gọn, độc lập, chạy được] (http://sscce.org/) thể hiện sự cố của bạn. Có rất nhiều người dùng lười biếng trên SO ([có nên có] (http://c2.com/cgi/wiki?LazinessImpatienceHubris)), vì vậy bạn càng dễ dàng thực hiện nó để gỡ lỗi chương trình của bạn, càng có nhiều câu trả lời bạn sẽ nhận được . – Kevin

Trả lời

5

Vấn đề là khi bạn gọi app.mainloop(), luồng đang bận thi hành đường vòng chính Tkinter, vì vậy các câu lệnh trước khi nó không được thực hiện cho đến khi bạn thoát khỏi vòng lặp. Nhưng một khi bạn thoát khỏi mainloop, bạn cố gắng sử dụng tiện ích Text nhưng nó đã bị phá hủy.

Tôi khuyên bạn nên di chuyển cuộc gọi đến main đến cuộc gọi lại của tiện ích Tkinter (Tôi cho rằng bạn đã cố thực hiện điều đó với app.button_press()), vì vậy đối tượng Văn bản có thể được sử dụng để hiển thị văn bản.

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ó cách nào để chuyển hướng stdin không? – schmi