应用程序图标在Matplotlib图形显示时会发生变化,并且永远不会恢复-仅适用于macOS

dl5txlt9  于 2023-11-22  发布在  Mac
关注(0)|答案(1)|浏览(165)

我对Python、Tkinter和Matplotlib还很陌生。
我需要从一个简单的tkinter应用程序显示一个图表,一切都按预期工作。
问题是,当图表出现时,docker中图标的应用程序会变成这样:


的数据
关闭图形窗口时,图标不会恢复到原来的图标,这很烦人。
我尝试了一些我在StackOverflow上找到的建议解决方案,但显然没有任何效果。
我的环境:

  • macos:14.1.1(索诺马)
  • Python:3.12(从下载的软件包安装)
  • PyCharm:2023.2.5

即使使用旧版本的python,我也遇到了同样的行为,但同样的代码在Windows上工作得很好。
这是我的测试代码(摘录以证明问题)。

from tkinter import *
import matplotlib
import matplotlib.pyplot as plt

root = Tk()

def show_graph():
    print("Graph")
    a = [90.2, 123.8, 110.2, 108.1, 115.0]
    b = [100, 100, 100, 100, 100]
    target = [98, 98, 98, 98, 98]
    weeks = [0, 1, 2, 3, 4]

    plt.Figure()
    figure1 = plt.figure(figsize=(4, 2), dpi=200)
    ax = figure1.add_subplot(111)
    ax.set_xticks(list(range(1, 24)))

    plt.plot(weeks, a, '--.', label="A")
    plt.plot(b, 'r--', label="B")
    plt.plot(target, 'g--', label="C")
    plt.legend()
    plt.xlabel('Week')
    plt.ylabel('A', labelpad=1)
    plt.grid(True, which="both", ls="-")

    figure1.show()

if __name__ == '__main__':
    matplotlib.use('TkAgg')

    root.title("Matplotlib Icon Issue")
    root.geometry('500x500')

    frame = Frame(root)
    frame.pack()

    Label(frame, text="label").grid(row=0, column=0)
    Button(frame, text="Graph", command=show_graph).grid(row=1, column=0)

    root.mainloop()

字符串

a0x5cqrl

a0x5cqrl1#

当显示图形时,您使用matplotlib的窗口管理器,而不是使用Tkinter,因此这是预期的。
既然你已经在使用Tkinter窗口管理器,那么你就不应该使用.show方法的图形,相反,你可以将图形嵌入到Tkinter Canvas。
示例来自https://matplotlib.org/3.1.0/gallery/user_interfaces/embedding_in_tk_sgskip.html

from tkinter import *
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

root = Tk()

def show_graph():
    ...
    figure1 = plt.figure(figsize=(4, 2), dpi=200)
    ...
    canvas = FigureCanvasTkAgg(figure1, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

字符串

相关问题