【问题标题】:python tk tkinter multiple canvas can not afford in my scrollable framepython tk tkinter 多个画布在我的可滚动框架中买不起
【发布时间】:2020-10-29 02:46:22
【问题描述】:
import tkinter as tk
from tkinter import filedialog
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,  NavigationToolbar2Tk) 
from matplotlib.figure import Figure 
import matplotlib.pyplot as plt
from data import dataprocess
root = tk.Tk()
root.geometry('1500x800')
container = tk.Frame(root)
main_canvas = tk.Canvas(container, width=1480, height=800,  bg='blue')
scrollbar = tk.Scrollbar(container, orient="vertical", command=main_canvas.yview)
scrollable_frame = tk.Canvas(main_canvas, bg='black')
scrollable_frame.bind(
"<Configure>",
lambda e: main_canvas.configure(
    scrollregion=main_canvas.bbox("all")
    )
)

main_canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")

main_canvas.configure(yscrollcommand=scrollbar.set)

for i in range(100):
    f = Figure(figsize=(5,5), dpi=100)
    a = f.add_subplot(111)
    a.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
    a.set_title("fig" + str(i))
    canvas = FigureCanvasTkAgg(f, 
                           master = scrollable_frame)
    canvas.draw()
    canvas.get_tk_widget().grid(row=i, column=0)

container.grid()
main_canvas.grid()
scrollbar.grid(row=0, column=1, sticky="nse")
container.mainloop()

我想在我的可滚动框架上生成大量画布,但它似乎因最大画布大小而失败。有什么方法可以解决吗? code image

【问题讨论】:

  • 可滚动的框架必须是 Frame,而不是 Canvas。
  • 可能使用多列而不是单列。或者使用main_canvas.create_window() 而不是可滚动的框架。但是,您的方法会显着降低系统性能。

标签: python-3.x tkinter canvas frame


【解决方案1】:

我猜测一下,您真正​​想要的是一个 ScrolledText 小部件。试试这个:

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,  NavigationToolbar2Tk)
from matplotlib.figure import Figure

root = tk.Tk()
root.geometry('1500x800')
scrollable_frame = ScrolledText(root)
scrollable_frame.pack(expand=True, fill=tk.BOTH)

for i in range(10):
    f = Figure(figsize=(5,5), dpi=100)
    a = f.add_subplot(111)
    a.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
    a.set_title("fig" + str(i))
    canvas = FigureCanvasTkAgg(f)
    scrollable_frame.window_create(tk.END, window=canvas.get_tk_widget())
    scrollable_frame.insert(tk.END, '\n')

root.mainloop()

无论如何,在计算机和人类上,100 个图表都会非常繁重。我认为最好以不同的方式设计您的程序,以便更新图表而不是滚动浏览许多图表。

【讨论】:

  • 上面的代码成功了!如果我想要 'grid' 而不是 'pack' 方法,我该怎么办。我还想在 ScrolledText 中添加一些小部件,例如按钮和标签。感谢您对我的指定提出建议,但这是出于特定目的。
  • 小部件在 Text 或 Canvas 中不使用网格或打包,您仅在添加到 Frame 类型时使用这些小部件。要添加按钮,您可以使用 window_create 方法添加它们,就像我用于图表一样。您也可以通过这种方式添加标签,但 Text 小部件支持原始文本,因此您可能希望为此使用 insert()。要将 Text 对象放入根窗口中,我使用了 pack(),但如果需要,您可以将其替换为 grid()。
  • 我成功了。这是一个关于我只想更改图 1~5 而不重新绘制所有图的新问题。有什么建议吗?
  • @curry 只是保留对绘图的引用并使用 set_data() 对其进行更新。如果您需要帮助,请发布新帖子。
  • 我可能知道你的意思。我仍然不知道如何将参考 id 放入每个绘图并使用 set_data() 进行更新。你能给我一些示例代码或参考链接吗?我很感激。
猜你喜欢
  • 2012-04-03
  • 2011-05-31
  • 2016-06-06
  • 2020-10-30
  • 1970-01-01
  • 2021-09-28
  • 2015-04-18
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多