python - 当 matplotlib 窗口打开时关闭 tkinter 进度条窗口

标签 python matplotlib plot tkinter

我正在编写一个程序,它可以完成一些工作并使用 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()

最佳答案

您正在启动的 TKplt 启动的 TK 之间存在冲突的 gui-main 循环。如果您想在自己的 GUI 中使用 matplotlib,您必须自行嵌入它,并且不能导入 pyplot。所有使 pyplot 界面变得精彩的幕后魔力却让您感到困惑。

有关教程,请参阅 here ,关于mpl如何嵌入,请参见 here .

另请参阅:

关于python - 当 matplotlib 窗口打开时关闭 tkinter 进度条窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833544/

相关文章:

python - 如何从日期时间文件中获取 numpy ndarray 并使用 matplotlib 绘制差异?

python - 如何为许多子图制作一个图例?

python - 更改维恩图中显示的内容

R:使用ggplot2绘制各组之间差异的facet_grid图

python - 为什么这个 CNN 脚本无法正确预测?

python - 哪个 haml-in-django 实现?

python - 如何在python dict中表示 "range"

python - 如何使用python计算Delta F/F?

Python - 用散点图堆叠两个直方图

r - 绘制由多个多边形定义的空间区域