草庐IT

Python Tkinter 在 GUI 中嵌入 Matplotlib

coder 2023-05-26 原文

我正在尝试在我的 Tkinter GUI 中嵌入一个用 Python 编码的绘图。我相信下面的代码成功地将图形简单地放入 Canvas 中,但我无法控制 GUI 网格中的 Canvas 位置。我希望能够让我的 GUI 的一个小部分成为情节……而不是全部。如何定位此 Canvas 小部件?

#!/usr/apps/Python/bin/python
import matplotlib, sys
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from Tkinter import *

master = Tk()
master.title("Hello World!")
#-------------------------------------------------------------------------------

f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0,3.0,0.01)
s = sin(2*pi*t)
a.plot(t,s)


dataPlot = FigureCanvasTkAgg(f, master=master)
dataPlot.show()
dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
#-------------------------------------------------------------------------------
master.mainloop()

最佳答案

您没有任何其他小部件,因此很难知道您想要其他小部件在哪里。不过,我可以告诉你的是:通过执行 dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) 您要求 Tkinter 用绘图填充屏幕。这是因为您要求它填充所有方向 (fill=BOTH) 并扩展以填充任何额外的空间 (expand=1)。

但是,您仍然可以添加其他小部件。 pack 通过将小部件放在容器的一侧来工作。您的容器 master 总是有四个面。因此,例如,如果您想创建一个工具栏,您可以执行以下操作:

toolbar = tk.Frame(master)
button = tk.Button(toolbar, text="Push me")
button.pack(side="left") # left side of parent, the toolbar frame
toolbar.pack(side=TOP, fill="x") # top of parent, the master window

请注意,如果您将此代码放在 pack 绘图的代码之后,工具栏会显示在底部!这是因为 TOPBOTTOM 等指的是任何其他已被 packed 的小部件留下的空间。情节占据了顶部,剩下的空间在底部。因此,当您再次指定 TOP 时,它的意思是“位于顶部下方区域的顶部”。

所以,你有一些选择。最好的选择是按照您希望它们出现的顺序制作小部件。如果在 pack 绘图之前pack 顶部的工具栏,它将是显示在最顶部的工具栏。此外,您可以将绘图放在底部而不是顶部,这也可以解决问题。

顺便说一句,我通常在一个 block 中创建我的小部件,然后将它们全部放在一个单独的 block 中。我发现它使代码更易于维护。

另一个更适合你的心智模型的选择是grid 而不是 pack。使用 grid 您可以选择小部件占用的行和列。这使得在网格中布置事物变得很容易,但代价是不得不使用更多的代码。

例如,要将工具栏放在顶部,而将绘图放在下方,您可以这样做:

toolbar.grid(row=1, column=1, sticky="ew")
dataPlot.get_tk_widget().grid(row=1, column=1, sticky="nsew")
master.grid_rowconfigure(0, weight=0)
master.grid_rowconfigure(1, weight=1)
master.grid_columnconfigure(0, weight=1)

请注意,行和列从零开始。此外,“重量”是指此小部件相对于其他小部件的扩展程度。两行重量相等,当窗口调整大小时,它们将同样展开。权重为零意味着没有膨胀。一行的权重为 2,另一行的权重为 1,表示前者的扩展量是后者的两倍。

有关详细信息,请参阅 this page on grid , 和 this page on pack .

关于Python Tkinter 在 GUI 中嵌入 Matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073660/

有关Python Tkinter 在 GUI 中嵌入 Matplotlib的更多相关文章

  1. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  2. ruby-on-rails - 如何在 RoR 中使用 content_tag 嵌入标签? - 2

    我有这个可以为我生成一个超链接:我希望它显示在td标签中,所以我想使用这个content_tag来帮助我:"example")%>我想要我的td中的超链接,所以我有这样的东西:,:class=>"example")%>但是我收到语法错误,我该怎么办? 最佳答案 内联:'example')%>或block形式:'example')do%> 关于ruby-on-rails-如何在RoR中使用content_tag嵌入标签?,我们在StackOverflow上找到一个类似的问题:

  3. Ruby GUI(非复杂布局) - 2

    我对RubyGUI设计做了很多研究,这似乎是Ruby倾向于落后的领域。我探索了MonkeyBars、wxRuby、fxRuby、Shoes等选项,只是想从Ruby社区获得一些意见。虽然它们绝对可用,但每一个的开发似乎都在下降。我在任何(减去fxRuby书)上都找不到大量有用的文档或用户基础。我只是想制作一个简单的GUI,所以我真的不想花费数百小时来学习更复杂的工具的复杂性或尝试使用甚至不再开发的东西(鞋子是应用程序的类型我正在寻找,但它有很多问题并且没有得到积极开发。)在所有选项中,你们会推荐哪个选项是最快的,并且仍然具有某种开发基础?谢谢! 最佳答案

  4. ruby - 在 ruby​​ 中使用 matplotlib.image 是否有等效项 - 2

    一直在尝试在jupyternotebook中使用Ruby。使用Python我可以做到这一点importmatplotlib.imageasmpimg有谁知道Ruby的等价物,我没能在任何iRuby或sciruby文档中找到它?澄清一点,在我的gemfile中我有这个gem'iruby'gem'cztop'gem'matplotlib'但似乎无法访问我习惯在python中使用的matplotlib的image部分。我正试图找到在Python中我会这样写的Ruby版本#importingsomeusefulpackagesimportmatplotlib.pyplotaspltimport

  5. ruby - shoes 是一个严肃的 ruby​​ GUI 工具包吗? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion有人用鞋子创建真正的桌面GUI应用程序还是仅用于学习目的?shoes可以和qtruby或者gtkforruby​​比吗?

  6. ruby - Ruby 是否有任何可嵌入的键值存储? - 2

    我需要快速可靠的Ruby键值存储。有没有类似的东西?要求它完全在Ruby进程内运行,不需要任何外部进程。它可能在显式磁盘刷新的内存中。它需要具有最小的键值检索时间,写入时间可能不太好。存储的数据量不会很糟糕,大约几十万个键,每个键都有~1kb的文本值。 最佳答案 事实证明,对我来说最好的选择是使用纯Hash和Marshal将其序列化到磁盘。对于那么多的对象,YAML肯定太慢了。感谢@ian-armit加强了我对核心Ruby库的信任。 关于ruby-Ruby是否有任何可嵌入的键值存储?,我

  7. ruby - mongoid 文档 to_json 包括所有嵌入的文档,每个文档都没有 ':include' - 2

    给定一个任意的mongoid文档,我如何将其转换为JSON并包含任何嵌入式结构,而不是在我的to_json语句中特别包含这些结构。例如:#!/usr/bin/envrubyrequire'mongoid'require'json'require'pp'classDocincludeMongoid::DocumentincludeMongoid::Timestampsfield:doc_specific_info,type:Stringembeds_many:personsendclassPersonincludeMongoid::Documentfield:role,type:Stri

  8. ruby - Mongoid:将嵌入式文档转换为引用/自己的集合 - 2

    我需要将嵌入式文档转换成它自己的集合,以便它可以从另一个集合中引用。假设我有一个Parent嵌入了许多Child。我在想一些事情:Parent.all.eachdo|p|p.childs.all.eachdo|c|c.raw_attributes['parent_id']=p.idendp.save!#willsaveparentandcascadepersistallchildsontotheirowncollend这是一个选项吗?理想情况下,我会在控制台中运行它,我只会将mongoid映射从embed_*更改为has_*,因此我不需要更改其余代码或使用另一个集合作为暂存。

  9. ruby - 在 HTML 中嵌入 Ruby 代码? - 2

    在PHP中,可以这样做:">是否可以像使用或不使用Rails那样将Ruby嵌入到HTML中? 最佳答案 您将需要使用像Ruby模板(ERB)这样的模板引擎。这是一个example.Rails使用ERB,因此您可以在每个模板中轻松地执行此操作。 关于ruby-在HTML中嵌入Ruby代码?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3486664/

  10. 带有嵌入变量的 Ruby 字符串 - 2

    如何在yaml中存储带有嵌入变量的ruby​​字符串,但仅当我从yaml获取字符串时才插入变量值? 最佳答案 str="Hi%{name},%{msg}.Bye%{name}."#yamlit,de-yamlitbacktostringh={:name=>"John",:msg=>"thismessageisforyou"}putsstr%h#=>HiJohn,Thismessageisforyou.ByeJohn. 关于带有嵌入变量的Ruby字符串,我们在StackOverflow上找

随机推荐