首页 > 解决方案 > tkinter 画布大小和导航工具栏问题

问题描述

在我的 Tkinter GUI 小部件中,我想将我的绘图放置在绘图区域(绘图框)中。但是,我有几个问题。

  1. 无论我向小部件添加多少列,图框都不会覆盖整个屏幕。我想要尽可能大的图表。

  2. 图表不是从框架的顶部开始的。但是文本是带有轴('off')的子图,从顶部开始。

  3. 我无法设置导航工具栏来保存图框的全部内容。

如果您提出建议,我将不胜感激。

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)
    submit_button = Button(submitframe, text='Submit', font=('' , '12' , ''), padx=10, relief=RIDGE, activebackground='green' , bg='orange' , bd=5).grid(row=0 , column=0 , rowspan=10 , ipady=10)


    x = [-100 , 100]
    y = [0 , 4]
    fig = plt.figure( facecolor='#104e8b' , edgecolor='k')
    gs = GridSpec(13 , 7)
    ax1 = fig.add_subplot(gs[0: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[8:13 , 5:6])
    ax2.text(0.5 , 0.5 ,
             "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 ,
             bbox={'facecolor': 'blue' , 'alpha': 0. , 'pad': 10}
             )
    ax2.axis('off')

    ax3 = fig.add_subplot(gs[10:13 , 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)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().grid(row=0 , column=0 ,  sticky='nsew')
    # toolbar = NavigationToolbar2Tk(canvas , plotframe)
    # toolbar.update()
    # canvas.get_tk_widget().grid(row=1 , column=0)
    # fig.tight_layout()

    root.mainloop()


if __name__ == '__main__':
    main()

标签: pythonmatplotlibtkintercanvas

解决方案


  1. .grid() 方法没有做你认为它做的事情。添加列和行并不一定会扩大小部件的大小,因为 Tkinter 总是试图将小部件打包在尽可能小的空间中。要增加图形大小,只需figsize=(x,y)在定义 fig 变量时添加参数。根据自己的喜好调整 x 和 y。

  2. top=1您可以通过在 line 中包含参数来将绘图提升到框架的顶部gs = fig.add_gridspec(13, 7)。我相信网格规范试图将 13x7 网格居中,因此它的“顶部”并不是真正位于网格的顶部,直到您覆盖它。

  3. 我不太确定这个答案,但这个链接似乎有同样的问题,并通过创建一个空框架来解决它,然后嵌入小部件并打包到该框架中。但是,它将与您的 root() 框架分开。

您现在唯一的问题是文本与图的顶部有点不一致。我建议添加verticalalignment='top' , 并且仅将其放置在第 0 行以始终将其放置在网格区域的顶部。

总而言之,这是修复 1 和 2 需要替换的两行:

fig = plt.figure(facecolor='#104e8b', edgecolor='k', figsize=(16,16))

gs = fig.add_gridspec(13, 7,top=1)

修复文本对齐:

ax2 = fig.add_subplot(gs[0, 5:6])
ax2.text(0.5, 0.5,
             "The  Specifications: \n\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,
             bbox={'facecolor': 'blue', 'alpha': 0., 'pad': 10},
             verticalalignment='top')

推荐阅读