我正在写一个程序,它使用matplotlib来绘制一些数据。这可能需要一些时间,所以我使用tkinter设置了一个进度条。使用tkinter进行线程化并不容易。我在主线程中运行进度条,在子线程中运行我的工作内容。但是,我无法在工作完成后关闭进度条窗口。因为很明显matplotlib在tk根窗口中做了一些事情。我不知道是什么。我添加了一个最小的例子来说明我要做的事情。注意,删除行“plotsomething()”使它做我想要做的事情:工作完成后关闭进度条.
你能帮我想想怎样才能在不关闭matplotlib窗口的情况下关闭进度条窗口吗?
# coding = utf-8
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import ttk
import threading, queue
import time
def MAIN():
PB = q.get()
for i in np.arange(10):
time.sleep(0.2)
print(i)
PB.step(10)
PB.update()
print("Done")
def plotsomething():
x = np.linspace(0,10,100)
y = np.sin(x)
plt.plot(x,y)
root = tk.Tk()
root.title("Progress")
PB = ttk.Progressbar(root, orient = "horizontal",length=300, mode = 'determinate')
PB.pack()
q = queue.Queue()
q.put(PB)
plotsomething()
T = threading.Thread(target=MAIN(), name="MAIN")
T.start()
T.join()
plt.show()
2条答案
按热度按时间2izufjch1#
你正在启动的
TK
和启动plt
的TK
之间出现了gui-main循环冲突。如果你想在自己的gui中使用matplotlib
,你 * 必须 * 自己嵌入它,而且你不能导入pyplot
。所有让pyplot
界面美妙的幕后魔术都是让你在这里一团糟的东西。有关教程请参见here,有关
mpl
如何嵌入请参见here。另见:
z18hc3ub2#
我现在通过使用matplotlib tk后端分别绘制每个窗口来解决这个问题。显然PyPlot干扰了tkinter根窗口。
此答案作为CC BY-SA 3.0下OP throwaway17434打开matplotlib窗口时关闭tkinter进度条窗口问题的edit发布。