2016-04-22 3 views
0

Я использую tkinter. У меня есть следующий код, выводящий консольный вывод в графический интерфейс в режиме реального времени. Теперь он просто печатает числа (требуется задержка, чтобы я мог видеть, что это в реальной жизни).Проблемы с отображением консоли в GUI в tkinter

import tkinter as tk 
import time 
import sys 

class Display(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white') 
     self.doIt.pack() 
     self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white') 
     self.output.pack() 
     sys.stdout = self 
     self.configure(background='black') 
     self.pack() 


    def start(self): 
     for i in range (1, 1000): 
      print (i) 
      time.sleep(2) 


    def write(self, txt): 
     self.output.insert(tk.END,str(txt)) 
     self.update_idletasks() 


if __name__ == '__main__': 
    Display().mainloop() 

Однако, когда я пытаюсь сложить окно или переключиться на другое приложение, оно замерзает. Другое дело, что я хочу, чтобы он прокручивался вниз и показывал новый результат, когда он доходил до конца окна. Я был бы признателен за любую помощь по этим вопросам.

+0

Я не вижу, как вы можете получить какой-либо вывод из опубликованного кода, но, может быть, я что-то упустил? –

+0

ну, я взял этот код из Интернета и немного изменил его, и он работает. Он печатает вывод консоли в текстовый виджет – Kate

+0

Хорошо для вас, я не мог заставить его работать ... но я вижу, что ваш вопрос был отредактирован, возможно, первая паста не была хорошей ... [edit] Не повезло: ( –

ответ

1

Я рекомендую вам не использовать time.sleep() в цикле обработки событий Tkinter, поскольку это приведет к приложению идти отвечать на запросы во время вызова сна. Из-за этого я предлагаю вам использовать вызов .after().

Что касается прокрутки, вам просто нужно добавить панель прокрутки в текстовый виджет. Вот пример:

import tkinter as tk 
import time 
import sys 

class Display(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white') 
     self.doIt.pack() 

     self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white') 
     self.output.pack(side=tk.LEFT) 

     self.scrollbar = tk.Scrollbar(self, orient="vertical", command = self.output.yview) 
     self.scrollbar.pack(side=tk.RIGHT, fill="y") 

     self.output['yscrollcommand'] = self.scrollbar.set 

     self.count = 1 
     self.configure(background='black') 
     self.pack() 


    def start(self): 
     if self.count < 1000: 
      self.write(str(self.count) + '\n') 
      print (self.count) 
      self.count += 1 
      self.after(2000, self.start) 


    def write(self, txt): 
     self.output.insert(tk.END,str(txt)) 
     self.update_idletasks() 


if __name__ == '__main__': 
    Display().mainloop() 
+0

Спасибо! Я использовал sleep(), чтобы проверить, работает ли он и никогда не мог подумать, что это вызовет проблемы хаха – Kate

0

Теперь это выводится как в console, так и в output tk window. Что не хватало, так это вызов self.write(). Я также подавил отклонение sysout к окну.

import tkinter as tk 
import time 
import sys 

class Display(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white') 
     self.doIt.pack() 
     self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white') 
     self.output.pack() 
#  sys.stdout = self 
     self.configure(background='black') 
     self.pack() 


    def start(self): 
     for i in range (1, 1000): 
      self.write(str(i) + '\n') 
      print (i) 
      time.sleep(2) 


    def write(self, txt): 
     self.output.insert(tk.END,str(txt)) 
     self.update_idletasks() 


if __name__ == '__main__': 
    Display().mainloop() 
Смежные вопросы