2016-04-22 34 views
0

私はtkinterを使用しています。 コンソール出力をライブモードでGUIに出力する次のコードがあります。これで簡単に数字が印刷されます(現実にあることがわかるように遅延が必要です)。コンソールをtkinterのGUIに出力する際の問題

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

あなたにはいいですが、動作させることができませんでした...しかしあなたの質問は編集されたかもしれません。おそらく最初のペーストは良くありませんでした... [編集] ( –

答えて

1

私はそれは、アプリケーションがスリープ通話中に応答しなく行くことになりますと、あなたがTkinterのイベントループで)(time.sleep使用していないお勧めします。このため、.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

ありがとうございます!それが問題を引き起こすとは決して考えられない – Kate

0

これで、consoleoutput 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() 
関連する問題