python - 访问使用 for 循环创建的条目小部件数据以进行绘图
问题描述
我是编程新手,我已经创建了这个 GUI,我的应用程序尝试通过两列条目小部件从用户那里收集几个输入浮点数据,然后将数据存储到一个列表中,以便我以后可以绘制这些数据在二维图上。我创建了一个包含最多 20 行的小部件表,用户通过组合框根据他们的数据定义它们。
我现在的问题是如何访问用户输入这些条目的数据并将它们存储在列表中,以便我可以使用matplotlib
?
请指教。
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkcalendar import *
from tkinter.ttk import *
window=Tk()
window.title ("xxxx")
wrapper2=LabelFrame(window,text='xxx Data')
wrapper2.pack(side=LEFT, fill="both",expand="yes",padx=10,pady=10)
###Table###
l4=tk.Label(wrapper2, text="Number Of Points")
l4.grid(row=0,column=0,columnspan=2)
Text_4=IntVar()
b1=ttk.Combobox(wrapper2,width=2,textvariable=Text_4,state='readonly')
b1["value"]=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
b1.grid(row=0,column=2)
l5=tk.Label(wrapper2, text="(Meters)")
l5.grid(row=1,column=1)
l6=tk.Label(wrapper2, text="Pre ")
l6.grid(row=1,column=2)
def table_generation():
rows=int(Text_4.get())
X_Depth=[]
Y_Pressure=[]
entryvar=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
entryname=["ae","be","ce","de","ee","fe","ge","he","ie","je","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","xe","ye","ze"]
for i in range(rows):
l4=tk.Label(wrapper2, text=i+1)
l4.grid(row=i+2,column=0)
for depth_col in range(0,1):
entryvar[i]=DoubleVar()
entryname[i] = Entry(wrapper2, text=entryvar[i])
entryname[i].grid(row=i+2, column=depth_col+1)
entryname[i].bind("<KeyRelease>", X_Depth.append(entryvar[i].get()))
X_Depth.append(entryname[i].get())
for press_col in range(1,2):
entryvar[i]=DoubleVar()
entryname[i] = Entry(wrapper2, text=entryvar[i])
entryname[i].grid(row=i+2, column=press_col+1)
entryname[i].bind("<KeyRelease>", Y_Pressure.append( entryvar[i].get()))
Y_Pressure.append( entryname[i].get())
print(X_Depth)
print(Y_Pressure)
b1=Button(wrapper2, text='Generate',command=table_generation)
b1.grid(row=0,column=3)
window.mainloop()
如果我在组合框小部件中输入值 5,例如将生成 5 行,用户可以输入值。但是,当向条目输入值时,列表 X_Depth 和 Y_Pressure 不会随用户输入而更新,而是保持不变显示 5 个零,如下所示。
[0.0, '0.0', 0.0, '0.0', 0.0, '0.0', 0.0, '0.0', 0.0, '0.0']
[0.0, '0.0', 0.0, '0.0', 0.0, '0.0', 0.0, '0.0', 0.0, '0.0']
解决方案
我不知道如何使用matplotlib
,但下面的代码显示了如何以我认为你想要的方式从用户那里获取数据(我在评论中提出了建议)。Get Lists一旦您弄清楚如何执行该部分,您可以轻松更改新添加的按钮以绘制输入的数据。
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkcalendar import *
from tkinter.ttk import *
window = Tk()
window.title("xxxx")
wrapper2 = LabelFrame(window,text='xxx Data')
wrapper2.pack(side=LEFT, fill="both", expand="yes", padx=10, pady=10)
###Table###
l4=tk.Label(wrapper2, text="Number Of Points")
l4.grid(row=0, column=0, columnspan=2)
Text_4 = IntVar()
b1 = ttk.Combobox(wrapper2, width=2, textvariable=Text_4, state='readonly')
b1["value"] = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
b1.grid(row=0, column=2)
l5 = tk.Label(wrapper2, text="(Meters)")
l5.grid(row=1, column=1)
l6 = tk.Label(wrapper2, text="Pre ")
l6.grid(row=1, column=2)
row_labels = [] # Global
depth_entries, depth_vars = [], [] # Global
pressure_entries, pressure_vars = [], [] # Global
btn_get = None
X_Depth, Y_Pressure = [], []
def table_generation():
''' Generate row widgets. '''
global btn_get
def destory_widgets(*widget_lists): # Helper func.
''' Destroy and clear lists of widgets. '''
for widget_list in widget_lists:
for widget in widget_list:
widget.destroy()
widget_list.clear()
if btn_get:
btn_get.destroy()
btn_get = None
destory_widgets(row_labels, depth_entries, pressure_entries)
for i in range(int(Text_4.get())): # Create table of widgets.
row_label= tk.Label(wrapper2, text=i+1)
row_label.grid(row=i+2, column=0)
row_labels.append(row_label)
entryvar = DoubleVar()
depth_vars.append(entryvar)
entry = Entry(wrapper2, text=entryvar)
entry.grid(row=i+2, column=1)
depth_entries.append(entry)
entryvar = DoubleVar()
pressure_vars.append(entryvar)
entry = Entry(wrapper2, text=entryvar)
entry.grid(row=i+2, column=2)
pressure_entries.append(entry)
btn_get = Button(wrapper2, text='Get Lists', command=get_lists)
btn_get.grid(row=i+3, column=0)
def get_lists():
''' Create lists from data in Entry widget vars. '''
global X_Depth, Y_Pressure
X_Depth.clear()
Y_Pressure.clear()
for depth, pressure in zip(depth_vars, pressure_vars):
X_Depth.append(depth.get())
Y_Pressure.append(pressure.get())
print('X_Depth:', X_Depth)
print('Y_Pressure:', Y_Pressure)
b1 = Button(wrapper2, text='Generate', command=table_generation)
b1.grid(row=0, column=3)
window.mainloop()
这是5
在组合框中选择并单击Generate按钮后的屏幕截图:
推荐阅读
- csv - Neo4j 导入 CSV 文件(neo.TransientError.General.OutOfMemoryError)
- java - Jackson 可以解析不是 ISO-8601 的日期时间值吗?
- java - 使用OkHttp时Webapp卸载内存泄漏,是否误报?
- mariadb - 使用机器的外部 IP 地址时无法连接到数据库
- java - 我需要从线程返回一些东西
- python-3.x - 如何找到索引为时间戳的每小时的多个斜率?
- scala - 如何将 DF 转换为字符串/数组,然后再转换回 DF?
- java - 使用 Java 检查 Spark Dataframe 中是否存在列
- centos - fio测量RAID0虚拟磁盘的IO速度混淆结果
- python-2.7 - Python和GTK3 - 手动设置按钮的最佳方式?