【问题标题】:tkinter canvas size and navigation toolbar issuestkinter 画布大小和导航工具栏问题
【发布时间】:2020-10-17 11:46:09
【问题描述】:

在我的 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()

【问题讨论】:

    标签: python matplotlib tkinter canvas


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

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

    3. 我不太确定这个答案,但This link 似乎有同样的问题,并通过创建一个空框架来解决它,然后嵌入小部件并打包到该框架中。但是,它将与您的 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')
    

    【讨论】:

    • 非常感谢您的回复。除了导航工具栏外,其他一切现在都在工作。我只需要再做一些调整。 ax1 应该从网格 #1 开始。 ax2 初始位置应更改为 (0.05, 0.95) 并添加选项 transform=ax2.transAxes。
    • 如果是这样,您介意接受我的回答吗?很高兴我能帮上忙!
    猜你喜欢
    • 2015-11-06
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多