我想将长进程的当前迭代显示为弹出窗口,而不是终端。计数需要在同一个弹出窗口内更新(或刷新)。据我所知:
from easygui import msgbox
msgbox(iterationcount)
启动弹出窗口后不要更新。它还会暂停脚本,直到弹出窗口关闭。任何人都有一个新颖的解决方案?
答案 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()
希望有所帮助。如果您有任何疑问,请告诉我们: - )