我試圖根據從 Ttk.checkbutton 中的選擇在 pyplot 中顯示不同的資料。為簡單起見,在示例中我將僅嘗試更改標題。
import tkinter as tk
from tkinter import ttk
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# create data to plot
xdata = np.linspace(0, 100, 100)
ydata = 0.1*xdata ** 2
# create window
root = tk.Tk()
# create figure
fig = plt.Figure(figsize = (10, 3), dpi = 100)
ax = fig.add_subplot()
ax.plot(xdata, ydata)
plt.show()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()
i = 0
def change_title():
global i
i = 1
ax.set_title(f'Title number {i}')
print(f'Title changed to {i}')
change_title()
change_title()
checkbutton = ttk.Checkbutton(root, command=change_title).pack()
root.mainloop()
因此,每次呼叫 change_title() 函式時,繪圖示題中的數字都應該增加。
這在直接從代碼呼叫函式時有效。但是,選中和取消選中 checkbutton 確實會呼叫該函式(并在控制臺中產生預期的輸出),但不會更改標題。執行上面的代碼并選中/取消選中復選框,例如 4 次,將得到以下結果:
- 情節的標題將是“Title number 2”
- 控制臺將輸出 'Title changed to 6'
我不明白為什么會這樣。為什么直接呼叫 change_title() 函式時標題會更改,而從 Checkbutton 呼叫時不會更改?
uj5u.com熱心網友回復:
您需要重新繪制畫布。接下來,但不是問題的一部分,不需要 plt.show() 和 first canvas.draw() 。
以下是修改后的代碼:
import tkinter as tk
from tkinter import ttk
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# create data to plot
xdata = np.linspace(0, 100, 100)
ydata = 0.1*xdata ** 2
# create window
root = tk.Tk()
# create figure
fig = plt.Figure(figsize = (10, 3), dpi = 100)
ax = fig.add_subplot()
ax.plot(xdata, ydata)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack()
i = 0
def change_title():
global i
i = 1
ax.set_title(f'Title number {i}')
print(f'Title changed to {i}')
canvas.draw()
change_title()
checkbutton = ttk.Checkbutton(root, command=change_title).pack()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/525161.html
標籤:python-3.xmatplotlibtkinterttkwidgets
上一篇:Pythonplot3D折線圖
