将迭代计数显示为弹出窗口

时间:2014-08-12 17:53:35

标签: python python-2.7

我想将长进程的当前迭代显示为弹出窗口,而不是终端。计数需要在同一个弹出窗口内更新(或刷新)。据我所知:

from easygui import msgbox
msgbox(iterationcount)

启动弹出窗口后不要更新。它还会暂停脚本,直到弹出窗口关闭。任何人都有一个新颖的解决方案?

2 个答案:

答案 0 :(得分:0)

我不知道msgbox,但如果你没有开始使用它,在迭代过程中更新弹出窗口的一种方法可能是通过matplotlib?我知道这是一个解决方案,而不是真正的答案,但这样的事情应该有效(虽然可以通过关闭轴标签来改善等)。

from matplotlib import pyplot as pyp

pyp.ion() 
pyp.figure() #open the figure
pyp.ylim([0.9,1.1]); pyp.xlim([0.9,1.1]) #set the axis boundaries so the textlabel is central

for i in range(20):
   print "in iteration", i
   pyp.cla(); #this clears the figure so the text doesn't get overwritten 
   pyp.text( 1,1,"%7i" %i); #write the number
   pyp.draw()  #and redraw the image

我不知道这个的表现 - 但如果这是一个很长的循环,它可能并不重要。

答案 1 :(得分:0)

弹出窗口永远不会自动刷新。在关闭窗口之前,理想情况下会暂停该过程。要实现这一点,你需要处理多线程,允许一个python线程运行基本程序,另一个python线程以gui弹出结果。

有多种方法可以做到这一点,我在下面重点介绍的是重定向print~stdout。 你需要做的就是#1定义你的程序---在下面的例子中它是(myprogram)---我在哪里重定向"打印输入"到GUI。

def myprogram(input):
    input = 0
    while True:
        input = input+1
        print input

#Now, prepare your Tkinter window and a thread to execute it.

from Tkinter import *
import threading
import Queue # This is thread safe
import time

class Std_redirector():
    def __init__(self, widget):
        self.widget = widget

    def write(self,string):
        self.widget.write(string)

class ThreadSafeText(Text):
    def __init__(self, master, **options):
        Text.__init__(self, master, **options)
        self.queue = Queue.Queue()
        self.update_me()

    def write(self, line):
        self.queue.put(line)

    def update_me(self):
        while not self.queue.empty():
            line = self.queue.get_nowait()
            self.insert(END, line)
            self.see(END)
            self.update_idletasks()
        self.after(10, self.update_me)



root = Tk()
text = ThreadSafeText(root)
text.pack()
sys.stdout = Std_redirector(text)

#All you need to do now is pass your function to the thread below,

thread1 = threading.Thread(target=myprogram) # Where myprogram is the function we defined at the beginning
thread1.start()

root.mainloop()

希望有所帮助。如果您有任何疑问,请告诉我们: - )