tkinter画布重复创建新框架

Payman Rajai

在我的Tkinter GUI小部件中,“提交”按钮命令在指定框架(plotframe)上绘制图。最初,画布代码和导航工具栏可以工作。但是,每当我按下“提交”按钮时,框架就会展开并创建一个新图形,而不是在相同的分配区域中进行绘制。

如何修改代码,以便情节本身进行更新?此外,导航工具栏的“保存”选项仅保存绘图,而不保存框架的全部内容。是否可以安排它来保存图解及其关联的文本?

如果有人帮助我解决这两个问题,我将不胜感激。

祝一切顺利,Payman

'''

from tkinter import *
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.backends._backend_tk import NavigationToolbar2Tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


def main ():
    root = Tk()
    w , h = root.winfo_screenwidth() , root.winfo_screenheight()
    root.geometry("%dx%d+0+0" % (w , h))
    root.resizable(width=True , height=True)
    root.title("Form")
    root.configure(bg='Dodgerblue4')
    root.state('zoomed')

    top_frame = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1, relief= SUNKEN, pady=10)
    frameX = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN, padx = 15, pady = 10)
    frameY = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN, padx = 15, pady = 10)
    submitframe = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN)
    plotframe = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN)
    # plotframe = Canvas(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN)


    top_frame.grid(column=0, row=0, sticky="nsew", columnspan= 20)
    top_frame.grid_columnconfigure(0 , weight=1)
    frameX.grid(column=0, row=1, sticky="nsew", columnspan = 2, rowspan = 6)
    frameY.grid(column=0, row=7, sticky="nsew", columnspan = 2, rowspan = 16)
    submitframe.grid(column=2, row=1, sticky="nsew", rowspan = 22)
    submitframe.grid_rowconfigure(0 , weight=1)

    plotframe.grid(column=3, row=1, sticky="nsew", rowspan = 22, columnspan = 17 )
    plotframe.grid_rowconfigure(0 , weight=1)
    plotframe.grid_columnconfigure(0 , weight=1)

    label_top = Label(top_frame , text="Design Page" , font=('' , '15' , ''), bg='Dodgerblue4' ,  fg='white', justify=CENTER).grid(row=0, column=0,columnspan= 20)

   # ------------------------------------------Xs-------------------------------------------------------------------------
    X1 = Label(frameX, text='X1', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=1, column=0, sticky = W)
    X2 = Label(frameX, text='X2', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=2, column=0, sticky = W)
    X3 = Label(frameX, text='X3', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=3, column=0, sticky = W)
    X4 = Label(frameX, text='X4', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=4, column=0, sticky = W)
    X5 = Label(frameX, text='X5', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=5, column=0, sticky = W)
    X6 = Label(frameX, text='X6', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=6, column=0, sticky = W)
    # -------------------------------------------Ys--------------------------------------------------------------------
    label_spec = Label(frameY, text='the parameters', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=0, column=0, columnspan = 2)
    Y1 = Label(frameY, text='Y1', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 1, column= 0, sticky = W)
    Y2 = Label(frameY, text='Y2', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 2, column= 0, sticky = W)
    Y3 = Label(frameY, text='Y3', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 3, column= 0, sticky = W)
    Y4 = Label(frameY, text='Y4', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 4, column= 0, sticky = W)
    Y5 = Label(frameY, text='Y5', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 5, column= 0, sticky = W)
    Y6 = Label(frameY, text='Y6', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 6, column= 0, sticky = W)
    Y7 = Label(frameY, text='Y7', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 7, column= 0, sticky = W)
    Y8 = Label(frameY, text='Y8', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 8, column= 0, sticky = W)
    Y9 = Label(frameY, text='Y9', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 9, column= 0, sticky = W)
    Y10 = Label(frameY, text='Y10', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 10, column= 0, sticky = W)
    Y11 = Label(frameY, text='Y11', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 11, column= 0, sticky = W)
    Y12 = Label(frameY, text='Y12', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 12, column= 0, sticky = W)
    Y13 = Label(frameY, text='Y13', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 13, column= 0, sticky = W)

    def todo():
        x = [-100 , 100]
        y = [0 , 4]
        fig = plt.figure( facecolor='#104e8b' , edgecolor='k', figsize=(9,6))
        gs = fig.add_gridspec(13 , 7 , top=1)

        ax1 = fig.add_subplot(gs[1:8 , 0:5])
        ax1.plot(x , y , 'b-' , label=' Profile 1')
        plt.xlabel(' x1 (mm) ' , color='w')
        plt.ylabel(' y1 (mm)' , color='w')
        plt.legend(loc='lower left')

        ax2 = fig.add_subplot(gs[1:12 , 5:6])
        ax2.text(0.05 , 0.95 ,
                 "The  Specifications: \n Y1 \n\n Y2, \n\n Y3, \n\n Y4, \n\n Y5,\n\n Y6, \n\n Y7, \n\n Y8, "
                 "\n\n Y9,\n\n Y10, \n\n Y11, \n\n Y12, \n\n Y13",
                 style='normal' , color='w' , fontsize=10 ,transform=ax2.transAxes, va='top',
                 bbox={'facecolor': 'blue' , 'alpha': 0. , 'pad': 10}
                 )
        ax2.axis('off')

        ax3 = fig.add_subplot(gs[8:12 , 0:5])
        ax3.plot(x , y , 'b-' , label=' Profile 2')
        plt.xlabel(' x2 (mm) ' , fontsize=10 , color='w')
        plt.ylabel(' y2 (mm)' , fontsize=10 , color='w')

        canvas = FigureCanvasTkAgg(fig , master=plotframe)
        canvas.get_tk_widget().pack(fill=BOTH , expand=1)
        toolbar = NavigationToolbar2Tk(canvas , plotframe)
        toolbar.config(background='Dodgerblue4')
        toolbar._message_label.config(background='Dodgerblue4')
        toolbar.update()
        canvas.draw()


    submit_button = Button(submitframe , text='Submit' , command=todo , font=('' , '12' , '') , padx=10 , relief=RIDGE ,
                           activebackground='green' , bg='orange' , bd=5)
    submit_button.grid(row=0 , column=0 , rowspan=10 , ipady=10)
    submit_button.flash()
    submit_button.invoke()

    root.mainloop()

if __name__ == '__main__':
    main()

'''

Payman Rajai

显然,在调用函数todo()之前,应先定义图形,画布和导航工具栏,并将canvas.draw()保留在函数内。这是工作代码:

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


def main ():
    root = Tk()
    w , h = root.winfo_screenwidth() , root.winfo_screenheight()
    root.geometry("%dx%d+0+0" % (w , h))
    root.resizable(width=True , height=True)
    root.title("Form")
    root.configure(bg='Dodgerblue4')
    root.state('zoomed')

    top_frame = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1, relief= SUNKEN, pady=10)
    frameX = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN, padx = 15, pady = 10)
    frameY = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN, padx = 15, pady = 10)
    submitframe = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN)
    plotframe = Frame(root , bg='Dodgerblue4' ,borderwidth=2, bd=1 , relief=SUNKEN)

    top_frame.grid(column=0, row=0, sticky="nsew", columnspan= 20)
    top_frame.grid_columnconfigure(0 , weight=1)
    frameX.grid(column=0, row=1, sticky="nsew", columnspan = 2, rowspan = 6)
    frameY.grid(column=0, row=7, sticky="nsew", columnspan = 2, rowspan = 16)
    submitframe.grid(column=2, row=1, sticky="nsew", rowspan = 22)
    submitframe.grid_rowconfigure(0 , weight=1)

    plotframe.grid(column=3, row=1, sticky="nsew", rowspan = 22, columnspan = 17 )
    plotframe.grid_rowconfigure(0 , weight=1)
    plotframe.grid_columnconfigure(0 , weight=1)

    label_top = Label(top_frame , text="Design Page" , font=('' , '15' , ''), bg='Dodgerblue4' ,  fg='white', justify=CENTER).grid(row=0, column=0,columnspan= 20)

   # ------------------------------------------Xs-------------------------------------------------------------------------
    X1 = Label(frameX, text='X1', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=1, column=0, sticky = W)
    X2 = Label(frameX, text='X2', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=2, column=0, sticky = W)
    X3 = Label(frameX, text='X3', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=3, column=0, sticky = W)
    X4 = Label(frameX, text='X4', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=4, column=0, sticky = W)
    X5 = Label(frameX, text='X5', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=5, column=0, sticky = W)
    X6 = Label(frameX, text='X6', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=6, column=0, sticky = W)
    # -------------------------------------------Ys--------------------------------------------------------------------
    label_spec = Label(frameY, text='the parameters', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row=0, column=0, columnspan = 2)
    Y1 = Label(frameY, text='Y1', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 1, column= 0, sticky = W)
    Y2 = Label(frameY, text='Y2', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 2, column= 0, sticky = W)
    Y3 = Label(frameY, text='Y3', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 3, column= 0, sticky = W)
    Y4 = Label(frameY, text='Y4', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 4, column= 0, sticky = W)
    Y5 = Label(frameY, text='Y5', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 5, column= 0, sticky = W)
    Y6 = Label(frameY, text='Y6', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 6, column= 0, sticky = W)
    Y7 = Label(frameY, text='Y7', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 7, column= 0, sticky = W)
    Y8 = Label(frameY, text='Y8', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 8, column= 0, sticky = W)
    Y9 = Label(frameY, text='Y9', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 9, column= 0, sticky = W)
    Y10 = Label(frameY, text='Y10', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 10, column= 0, sticky = W)
    Y11 = Label(frameY, text='Y11', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 11, column= 0, sticky = W)
    Y12 = Label(frameY, text='Y12', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 12, column= 0, sticky = W)
    Y13 = Label(frameY, text='Y13', fg='white', bg='Dodgerblue4', font=('' , '12' , ''), justify=CENTER).grid(row= 13, column= 0, sticky = W)
    
    fig = plt.figure(facecolor='#104e8b' , edgecolor='k' , figsize=(10 , 6))
    canvas = FigureCanvasTkAgg(fig , master=plotframe)
    canvas.get_tk_widget().pack(fill=BOTH , expand=1)
    toolbar = NavigationToolbar2Tk(canvas , plotframe)
    toolbar.config(background='Dodgerblue4')
    toolbar._message_label.config(background='Dodgerblue4')

    def todo():
        plt.clf()
        x = [-100 , 100]
        y = [0 , 4]
        gs = fig.add_gridspec(13 , 7 , top=1)
        ax1 = fig.add_subplot(gs[1:8 , 0:5])
        ax1.plot(x , y , 'b-' , label=' Profile 1')
        plt.xlabel(' x1 (mm) ' , color='w')
        plt.ylabel(' y1 (mm)' , color='w')
        plt.legend(loc='lower left')

        ax2 = fig.add_subplot(gs[1:12 , 5:6])
        ax2.text(0.05 , 0.95 ,
                 "The  Specifications: \n Y1 \n\n Y2, \n\n Y3, \n\n Y4, \n\n Y5,\n\n Y6, \n\n Y7, \n\n Y8, "
                 "\n\n Y9,\n\n Y10, \n\n Y11, \n\n Y12, \n\n Y13",
                 style='normal' , color='w' , fontsize=10 ,transform=ax2.transAxes, va='top',
                 bbox={'facecolor': 'blue' , 'alpha': 0. , 'pad': 10}
                 )
        ax2.axis('off')

        ax3 = fig.add_subplot(gs[8:12 , 0:5])
        ax3.plot(x , y , 'b-' , label=' Profile 2')
        plt.xlabel(' x2 (mm) ' , fontsize=10 , color='w')
        plt.ylabel(' y2 (mm)' , fontsize=10 , color='w')

    toolbar.update()
    canvas.draw()


    submit_button = Button(submitframe , text='Submit' , command=todo , font=('' , '12' , '') , padx=10 , relief=RIDGE ,
                           activebackground='green' , bg='orange' , bd=5)
    submit_button.grid(row=0 , column=0 , rowspan=10 , ipady=10)
    submit_button.flash()
    submit_button.invoke()

    root.mainloop()

if __name__ == '__main__':
    main()

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何刷新或销毁在 tkinter python 画布中创建的框架?

来自分类Dev

实体框架为关联的对象创建新的/重复的条目

来自分类Dev

在tkinter中创建框架

来自分类Dev

在Tkinter画布内创建LabelFrame

来自分类Dev

Tkinter 画布多次创建图像

来自分类Dev

Java创建新框架

来自分类Dev

单击创建新的画布动画

来自分类Dev

画布上的框架与画布中创建的线重叠

来自分类Dev

在Tkinter Python中创建全局画布

来自分类Dev

Python tkinter 在画布上创建对象

来自分类Dev

C#实体框架6-具有新外键的新记录将创建重复项

来自分类Dev

打开文件并创建新框架

来自分类Dev

我无法在画布的框架中滚动网格(tkinter)

来自分类Dev

Tkinter:如何在画布窗口中获取框架以扩展到画布的大小?

来自分类Dev

是否可以从tkinter窗口创建框架?

来自分类Dev

使用2D数组创建可单击的TKinter画布

来自分类Dev

在tkinter画布对象的查看区域周围创建“障碍”

来自分类Dev

使用2D数组创建可单击的TKinter画布

来自分类Dev

在tkinter画布对象的查看区域周围创建“障碍”

来自分类Dev

在tkinter画布上动态创建/删除绘制对象?

来自分类Dev

使用 TKINTER 和画布点击创建和移动形状

来自分类Dev

Tinkerpop框架:如何创建新的顶点

来自分类Dev

在新框架中创建多个词条

来自分类Dev

如何在 tkinter 画布上创建文本并更改画布中的文本?

来自分类Dev

habtm上的saveall创建重复的新行

来自分类Dev

想要创建新对象,而不是项目重复

来自分类Dev

Tkinter修复框架的大小不与滚动条重叠画布边框

来自分类Dev

python tk tkinter在我的可滚动框架中无法承受多个画布

来自分类Dev

Tkinter修复框架的大小不与滚动条重叠画布边框

Related 相关文章

热门标签

归档