ฉันขอโทษสำหรับชื่อเรื่อง แต่ฉันไม่สามารถนึกถึงคำอธิบายปัญหาที่ดีไปกว่านี้ได้ ฉันมีโปรแกรมที่ใช้ Tkinter ซึ่งมีตัวเลือกสำหรับผู้ใช้ในการสร้างรายงาน PDF ที่ประกอบด้วยภาพรวม ตามด้วยโครงเรื่องรายละเอียดบางส่วน ฉันรู้ว่าด้วยเหตุผลบางอย่างโปรแกรมทั้งหมดจะปิดตัวลงหลังจากสรุปรายงาน PDF แต่ฉันเพิ่งนั่งลงเพื่อระบุอย่างแท้จริงว่าอะไรเป็นสาเหตุ
ฉันพบว่าบรรทัด plt.close
ในพล็อตภาพรวมเริ่มต้น ทำให้โปรแกรมทั้งหมดปิดเมื่อเขียนรายงาน pdf แล้ว (ซึ่งเป็นส่วนแรกที่ฉันไม่เข้าใจอย่างแน่นอน หาก plot.close
ตำหนิว่าทำไมทั้งหมด โมดูลทำงานจนเสร็จสิ้น)? ประการที่สอง ทำไมสิ่งนี้ถึงเกิดขึ้น?
ตัวอย่างขั้นต่ำที่ฉันสามารถสร้างได้ (พร้อมข้อมูลไร้สาระสำหรับแปลง) แสดงอยู่ด้านล่าง โดยหากบรรทัดที่นำหน้าด้วย # THE CULPRIT
ถูกแสดงความคิดเห็น อินสแตนซ์ Tk()
จะยังคงมีชีวิตอยู่ แต่หากปล่อยไว้ดังที่เป็นอยู่ อินสแตนซ์ Tk()
จะถูกปิด
import tkinter as tk
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
from pathlib import Path
class Pdf(object):
def __init__(self, master):
self.master = master
pdf = PdfPages(Path.cwd() / 'demo.pdf')
self.pdf = pdf
def plot_initial(self):
fig = plt.figure(figsize=(8,6))
fig.add_subplot(111)
mu, sigma = 0, 0.1
s = np.random.normal(mu, sigma, 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
linewidth=2, color='r')
plt.title('Overview')
plt.xlabel('X')
plt.ylabel('Y')
self.pdf.savefig(fig)
# THE CULPRIT
plt.close(fig)
def plot_extra(self):
fig = plt.figure(figsize=(8,6))
fig.add_subplot(111)
mu, sigma = 0, 0.1
s = np.random.normal(mu, sigma, 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
linewidth=2, color='r')
plt.title('Extra')
plt.xlabel('X')
plt.ylabel('Y')
self.pdf.savefig(fig)
plt.close(fig)
def close(self):
self.pdf.close()
class MVE(object):
@classmethod
def run(cls):
root = tk.Tk()
MVE(root)
root.mainloop()
def __init__(self, master):
self.root = master
tk.Frame(master)
menu = tk.Menu(master)
master.config(menu=menu)
test_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label='Bug', menu=test_menu)
test_menu.add_command(label='PDF', command=
self.generate_pdf)
def generate_pdf(self):
pdf = Pdf(self)
pdf.plot_initial()
for i in range(0,3):
pdf.plot_extra()
pdf.close()
if __name__ == "__main__":
MVE.run()
เวอร์ชันของแพ็คเกจ/ฐานหลามที่ติดตั้ง:
- หลาม 3.7.0
- ทีคินเตอร์ 8.6
- Matplotlib 2.2.3
- จำนวน 1.15.1
แก้ไข
ฉันได้อัปเกรดเป็น Matplotlib 3.0.2 ตามคำแนะนำ @ImportanceOfBeingErnest แล้ว แต่ปัญหายังคงอยู่
plt.close()
ทำบางอย่างที่ทำให้เซสชันTk()
สิ้นสุดลง สิ่งนี้จะเกิดขึ้นหากใช้แบ็กเอนด์ Tk เท่านั้น ดังนั้นหากใช้แบ็กเอนด์ Qt5Agg สำหรับ pyplot แต่การรักษาแอป tk ไว้เหมือนเดิมน่าจะใช้งานได้ - แต่โดยทั่วไปแล้วไม่เป็นที่ต้องการ - person ImportanceOfBeingErnest   schedule 19.02.2019plt.close
ที่ซ่อนอยู่ - person Bas Jansen   schedule 19.02.2019"Agg"
ได้ ซึ่งไม่จำเป็นต้องใช้ชุดเครื่องมือ QUI เพิ่มเติมใดๆ - person ImportanceOfBeingErnest   schedule 19.02.2019