首页 > 解决方案 > 访问使用 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']

标签: pythonmatplotlibtkinter

解决方案


我不知道如何使用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按钮后的屏幕截图:

它运行的屏幕截图


推荐阅读