- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Tkinter 和 matplotlib 在 Python 中制作了一个图形查看器 GUI 程序,我在两个图形之间切换。
我有三个问题我不知道如何解决:
import matplotlib
import tkinter as Tk
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
from tkinter import *
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib.widgets import Slider, RadioButtons
# Seperated out config of plot to just do it once
def config_plot():
fig, ax = plt.subplots()
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='Graph One')
return (fig, ax)
class matplotlibSwitchGraphs:
def __init__(self, master):
self.master = master
self.frame = Frame(self.master)
self.fig, self.ax = config_plot()
self.graphIndex = 0
self.canvas = FigureCanvasTkAgg(self.fig, self.master)
self.config_window()
self.draw_graph_one()
self.frame.pack(expand=YES, fill=BOTH)
def config_window(self):
self.canvas.mpl_connect("key_press_event", self.on_key_press)
toolbar = NavigationToolbar2Tk(self.canvas, self.master)
toolbar.update()
self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
self.button = Button(self.master, text="Quit", command=self._quit)
self.button.pack(side=BOTTOM)
self.button_switch = Button(self.master, text="Switch Graphs", command=self.switch_graphs)
self.button_switch.pack(side=BOTTOM)
def plot_data(self):
def func3(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-(x ** 2 + y ** 2))
dx, dy = 0.05, 0.05
x = np.arange(-3.0, 3.0, dx)
y = np.arange(-3.0, 3.0, dy)
X, Y = np.meshgrid(x, y)
self.extent = np.min(x), np.max(x), np.min(y), np.max(y)
self.Z1 = np.add.outer(range(8), range(8)) % 2 # chessboard
self.Z2 = func3(X, Y)
def draw_graph_one(self):
self.plot_data()
self.ax.remove()
self.ax = plt.imshow(self.Z2, cmap=plt.cm.viridis, alpha=.9, interpolation='bilinear',
extent=self.extent)
self.canvas.draw()
def draw_graph_two(self):
self.plot_data()
self.ax.remove()
self.ax = plt.subplot(1, 2, 1)
self.ax = plt.imshow(self.Z1, cmap=plt.cm.gray, interpolation='nearest',
extent=self.extent)
self.ax = plt.subplot(1, 2, 2)
self.a = plt.imshow(self.Z2, cmap=plt.cm.viridis, alpha=.9, interpolation='bilinear',
extent=self.extent)
self.b = plt.imshow(self.Z1, cmap=plt.cm.gray, interpolation='nearest',
extent=self.extent)
self.canvas.draw()
plt.subplots_adjust(left=0.15, bottom=0.15)
slider_ax = plt.axes([0.06, 0.25, 0.0225, 0.5])
alfa_slider = Slider(slider_ax,
label="Transparency",
valmin=0,
valmax=1,
valinit=0,
orientation="vertical"
)
alfa_slider.on_changed(self.update_slider)
rax = plt.axes([0.06, 0.05, 0.15, 0.15])
radio = RadioButtons(rax, ('Reds', 'Greens', 'Blues', 'Oranges', 'Wistia', 'plasma', 'inferno'), active=0)
radio.on_clicked(self.update_radio)
self.canvas.draw()
def update_slider(self,alpha_):
self.b.set_alpha(alpha_)
self.canvas.draw()
def update_radio(self,label_):
self.b.set_cmap(label_)
self.canvas.draw()
def on_key_press(self,event,toolbar):
print("you pressed {}".format(event.key))
key_press_handler(event, self.canvas, toolbar)
def _quit(self):
self.master.quit() # stops mainloop
def switch_graphs(self):
# Need to call the correct draw, whether we're on graph one or two
self.graphIndex = (self.graphIndex + 1) % 2
if self.graphIndex == 0:
self.draw_graph_one()
else:
self.draw_graph_two()
def main():
root = Tk()
matplotlibSwitchGraphs(root)
root.mainloop()
if __name__ == '__main__':
main()
我试图在函数内部输入 update_slider 和 update_radio 函数,但我不能使用 self.canvas.draw()。
最佳答案
首先回答你的最后一个问题,你的大问题是你试图用一个数字来显示两个单独的图形,而不了解 pyplot 的实际工作原理。这样做是可能的,正如我将在下面概述的那样,但是当您在它们之间切换时,您对图表所做的任何修改都会丢失。我建议阅读 working with multiple axes and figures section of the pyplot tutorial .在 MATLAB 和 pyplot 中的关键要点是,所有绘图函数都应用于最后一个图形和轴。
当您拨打 self.draw_graph_two()
,您创建的最后一个轴是 RadioButtons
.因此,pyplot 将这些轴作为当前轴。当您拨打 self.draw_graph_one()
时第二次(第一次是在您初始化时),它在当前图形和当前轴上绘制图,其中 RadioButtons
是。
要解决此问题,请调用 plt.clf()
作为draw_graph_one
的第一行和 draw_graph_two
, 在尝试绘制新图形之前。这会清除图形,允许从头开始绘制新图(这是您的两个绘制函数所做的)。这允许您在两个绘图之间连续切换,尽管每次切换绘图都会被清除并且对绘图的任何修改都会丢失。您也可以删除 self.ax.remove()
行,因为它们会导致错误并且不需要。
对于前两个问题,可以通过阅读 RadioButtons
的文档来回答这些问题。和 Slider
here .您必须保留对小部件的引用,以便它们保持响应。所以修改你的 draw_graph_two
返回 alfa_slider
和 radio
使这些小部件保持响应。或者,将它们声明为实例变量也会保留一个引用( self.alfa_slider
和 self.radio
)。
所以你的工作图表查看器是:
import matplotlib
import tkinter as tk
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib.widgets import Slider, RadioButtons
# Seperated out config of plot to just do it once
def config_plot():
fig, ax = plt.subplots()
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='Graph One')
return (fig, ax)
class matplotlibSwitchGraphs:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.fig, self.ax = config_plot()
self.graphIndex = 0
self.canvas = FigureCanvasTkAgg(self.fig, self.master)
self.config_window()
self.plot_data()
self.draw_graph_one()
self.frame.pack(expand=True, fill=tk.BOTH)
def config_window(self):
self.canvas.mpl_connect("key_press_event", self.on_key_press)
toolbar = NavigationToolbar2Tk(self.canvas, self.master)
toolbar.update()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.button = tk.Button(self.master, text="Quit", command=self._quit)
self.button.pack(side=tk.BOTTOM)
self.button_switch = tk.Button(self.master, text="Switch Graphs", command=self.switch_graphs)
self.button_switch.pack(side=tk.BOTTOM)
def plot_data(self):
def func3(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-(x ** 2 + y ** 2))
dx, dy = 0.05, 0.05
x = np.arange(-3.0, 3.0, dx)
y = np.arange(-3.0, 3.0, dy)
X, Y = np.meshgrid(x, y)
self.extent = np.min(x), np.max(x), np.min(y), np.max(y)
self.Z1 = np.add.outer(range(8), range(8)) % 2 # chessboard
self.Z2 = func3(X, Y)
def draw_graph_one(self):
plt.clf()
self.ax = plt.imshow(self.Z2, cmap=plt.cm.viridis, alpha=.9, interpolation='bilinear',
extent=self.extent)
self.canvas.draw()
def draw_graph_two(self):
plt.clf()
self.ax = plt.subplot(1, 2, 1)
self.ax = plt.imshow(self.Z1, cmap=plt.cm.gray, interpolation='nearest',
extent=self.extent)
self.ax = plt.subplot(1, 2, 2)
self.a = plt.imshow(self.Z2, cmap=plt.cm.viridis, alpha=.9, interpolation='bilinear',
extent=self.extent)
self.b = plt.imshow(self.Z1, cmap=plt.cm.gray, interpolation='nearest',
extent=self.extent)
self.canvas.draw()
plt.subplots_adjust(left=0.15, bottom=0.15)
slider_ax = plt.axes([0.06, 0.25, 0.0225, 0.5])
self.alfa_slider = Slider(slider_ax,
label="Transparency",
valmin=0,
valmax=1,
valinit=0,
orientation="vertical"
)
self.alfa_slider.on_changed(self.update_slider)
rax = plt.axes([0.06, 0.05, 0.15, 0.15])
self.radio = RadioButtons(rax, ('Reds', 'Greens', 'Blues', 'Oranges', 'Wistia', 'plasma', 'inferno'), active=0)
self.radio.on_clicked(self.update_radio)
self.canvas.draw()
def update_slider(self,alpha_):
self.b.set_alpha(1-alpha_)
self.canvas.draw()
def update_radio(self,label_):
self.b.set_cmap(label_)
self.canvas.draw()
def on_key_press(self,event,toolbar):
print("you pressed {}".format(event.key))
key_press_handler(event, self.canvas, toolbar)
def _quit(self):
self.master.quit() # stops mainloop
def switch_graphs(self):
# Need to call the correct draw, whether we're on graph one or two
self.graphIndex = (self.graphIndex + 1) % 2
if self.graphIndex == 0:
self.draw_graph_one()
else:
self.draw_graph_two()
def main():
root = tk.Tk()
matplotlibSwitchGraphs(root)
root.mainloop()
if __name__ == '__main__':
main()
注意我还做了一些其他的轻微修改。不要使用
from tkinter import *
,您已经在上面导入并使用
import *
是个坏习惯。我反转了滑块以使透明度有意义。
self.plot_data()
仅在
__init__
中调用一次因为它不会改变。
关于python - 如何在两个图形之间切换并保持单选按钮和 slider 更新工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68931326/
HTML 部分,只是我代码的一部分: HP: SP: EA: ED: PA: PD:
我有这个简单的脚本。我正在尝试获取选中的值并将它们添加到禁用输入框中的运行总计中。我知道它正在被选中,但它没有更新到输入框,我不确定为什么。谁能帮帮我? function updateF
我在使用自定义背景的单选按钮/复选框时遇到了问题。我在这里设计了它们的样式:Quick Tip: Easy CSS3 Checkboxes and Radio Buttons .主要部分是input在
我可以预见地读取 jQueryUI 单选按钮的值,但是,我无法以编程方式设置它。无论我使用哪种方法更改单选按钮的值,jQueryUI 界面都不会更新其界面。 Yes No
没有展开时 点击展开之后 <div class="flashread_item_box_time"> <span class="
这里是 JQuery 新手。 我有一个大约有 16 个字段的搜索表单,其中大部分是文本框。其余的都是下拉菜单。我在这些字段下方有 3 个单选按钮。当选择第一个时,表单中的某些字段应被禁用。当选择第二个
我目前正在构建一个 Fiori 应用程序用于查看事件(票证)。我必须创建一个饼图,其中包含票证的所有不同状态。当我单击图表的一部分时,它会将我带到包含该状态的所有票证的列表。我可以选择饼图的多个状态,
此代码将在使用 reloadData 刷新 UITableView 后恢复单元格选择: NSIndexPath *selectedIndexPath = [self.tableView indexPa
我正在尝试对 UITableView 单元格进行自定义选择。为此,我在我的单元格上方创建了 UIView,它现在在触摸时出现/消失。但问题是当我按下单元格选择时出现。如果那时我选择任何其他行,它也会被
我所有的复选框、单选框和文本输入都在 ID 的末尾附加了“_boom”。我想抓取这些 id 的页面,检测更改以查看其中是否有任何一个与其原始状态不同,如果是,则将 CSS 应用于页面上名为“保存”的按
我正在寻找一种方法,使多选列表框应显示为普通的单选组合框,但在单击时它应作为允许多选的列表框,如下所示,如电子表格中所示。我正在寻找 CSS HTML 和 javascript 而非 Jquery 中
我有一个 HTML 我想显示为“列表框”(一个同时显示多个元素的框,而不是下拉框)。但是,我只想允许选择一个元素。我还想将盒子的高度(通过 CSS)设置为其容器大小的 100%。 这三件事似乎是相互排
我有一个包含三个部分的付款表格。基本上,第一个是带有乘数的“单选”列表,第二个是带有设置值的“复选框”列表,第三个是带有乘数的下拉列表 ==> (jsfiddle) .为清楚起见,我插入了一个文本框来
我想删除单选按钮,只显示是或否标签。为此,我隐藏了 radio 输入并使用 css3 选择器 (:checked + label) 根据选择更改背景颜色。但由于某种原因,这不起作用。 HTML(来自
我正在使用这个插件http://www.erichynds.com/examples/jquery-ui-multiselect-widget/demos/#single对于多选,并且希望也可以在同一
我收到了这段代码,但我似乎无法正常工作,我查看了之前的问题,但找不到任何与之完全相同的代码。也许这完全是错误的,应该重新开始? 我想要做的是在选择单选按钮时显示一个 div。这是我的代码: jQue
我试图在用户点击输入(单选、复选框或选择)时移除焦点背景,但它不起作用。这些是我放在元素上的样式: .form-holder input[type="radio"]:focus, .form-
我正在使用 Bootstrap 4 并想使用单选按钮和复选框按钮组,但按钮显示的是实际的单选按钮和复选框 UI 元素,如下所示: 上面的例子直接摘自文档。我试过删除并重新安装 Bootstrap 4,
我正在使用 Collection View 进行水平滚动。它工作得很好。现在我想为选择任何单元格设置任何效果。所以,我写了这段代码” func collectionView(collectionVi
我有一个按钮组,其中包含必须充当单选按钮的几个项目。我还需要将它们分成几行并跨越容器的整个宽度。 为此,我使用了 Bootstrap 的类 btn-group-justified ,然后我拆分 元素分
我是一名优秀的程序员,十分优秀!