2017-05-01 19 views
0

スクリプトの実行中に画面にログ行を表示するための洗練された方法を探しています。パラレルGUIを使用して画面にログ行を表示

from time import sleep 
from threading import Thread 
import tkinter as tk 


class WaitGuiPrallel(Thread): 
    def __init__(self, TXT='Wait!', ttl='Logs'): 
     self.txt = TXT 
     Thread.__init__(self) 
     self.ttl = ttl 
     self.start() # This is starting the self.run() 

    def run(self): 
     self.root = tk.Tk() 
     self.root.attributes("-topmost", True) 
     self.root.title(self.ttl) 
     self.label = tk.Label(self.root, text=self.txt, font=("Helvetica", 20)) 
     self.label.pack() 
     self.Location() 
     self.root.mainloop() 

    def Exit(self): 
     self.root.quit() 

    def Location(self): 
     w = 500 # width for the Tk root 
     h = 150 # height for the Tk root 
     ws = self.root.winfo_screenwidth() # width of the screen 
     self.root.geometry('%dx%d+%d+%d' % (w, h, ws - w - 20, 10)) 

    def Update(self, newText): 
     self.txt1 = newText 
     self.label.destroy() 
     self.label = tk.Label(self.root, text=self.txt1, 
           font=("Helvetica", 12)) 
     self.label.pack() 
     self.root.update() 

Wait = WaitGuiPrallel(TXT='Wait! Do not touch mouse or keyboard') 
sleep(2) 
for t in range(5): 
    sleep(1) 
    Wait.Update(newText='Log line %s' % t) 
Wait.Update(newText='Done!') 
sleep(1) 
Wait.Exit() 

現在のスクリプトは、いくつかの問題だ:それはエレガントではありません

  1. を - 別のスレッドから更新されたときに、それは問題を抱えているのより良い方法

  2. がなければならない

  3. Spyder + IPythonから2回実行することはできません(IPythonフリーズ)

+0

2つのウィンドウを同時に開いてもらいたいのですか?スレッドについては忘れて、 'tk.Topvel'を使って2番目のウィンドウを作成してください。 – Novel

答えて

0

Tkinterは本当にスレッドでうまくいっていません。 StringVarを使用すると、他のメソッド(私の経験では)よりも少しスレッドが親切です。ここでそれを行う方法ですプラスカップルその他の修正:あなたはこれを呼び出す複数のスレッドがある場合は

from time import sleep 
from threading import Thread 
import tkinter as tk 

class WaitGuiPrallel(Thread): 
    def __init__(self, TXT='Wait!', ttl='Logs'): 
     Thread.__init__(self) 
     self.txt = TXT 
     self.ttl = ttl # what's this for? 
     self.daemon = True # this thread will terminate when the main thread terminates 
     self.start() # This is starting the self.run() 

    def run(self): 
     self.root = tk.Tk() 
     self.root.attributes("-topmost", True) 
     self.root.title(self.ttl) 
     self.txt = tk.StringVar(value=self.txt) 
     self.label = tk.Label(self.root, textvariable=self.txt, font=("Helvetica", 20)) 
     self.label.pack() 
     self.Location() 
     self.root.mainloop() 

    def Location(self): 
     w = 500 # width for the Tk root 
     h = 150 # height for the Tk root 
     ws = self.root.winfo_screenwidth() # width of the screen 
     self.root.geometry('%dx%d+%d+%d' % (w, h, ws - w - 20, 10)) 

Wait = WaitGuiPrallel(TXT='Wait! Do not touch mouse or keyboard') 
sleep(2) 
for t in range(5): 
    sleep(1) 
    Wait.txt.set('Log line %s' % t) 
Wait.txt.set('Done!') 
sleep(1) 

はその後、私はキューとキューを監視するための第三のスレッドを使用して検討します。

+0

お返事ありがとうございますが、あなたのスクリプトは(私のコンピュータ上で)動作しません。 'Wait.txt.set(...)'を作成することはできず、 'Wait.txt =' Log line%s '%t'に変更すると更新されず、最後にウィジェットを閉じないでください。 – user1889297

+0

私はそれをテストし、それは私のために働く。エラーメッセージが表示されますか? 'Wait.txt = 'Log line%s'%t ''で動作するように構文を変更したい場合は、プロパティセッターを作成する必要があります。 – Novel

+0

Spyder + IPythonを使用しているときは初めて実行されますが、2回目に実行するとエラーが発生します:RuntimeError:メインスレッドはメインループにありません – user1889297

関連する問題