我正在编写一个程序,它可以完成一些工作并使用 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()
最佳答案
您正在启动的 TK
与 plt
启动的 TK
之间存在冲突的 gui-main 循环。如果您想在自己的 GUI 中使用 matplotlib
,您必须自行嵌入它,并且不能导入 pyplot
。所有使 pyplot
界面变得精彩的幕后魔力却让您感到困惑。
有关教程,请参阅 here ,关于mpl
如何嵌入,请参见 here .
另请参阅:
关于python - 当 matplotlib 窗口打开时关闭 tkinter 进度条窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833544/