[英]Converting Pandas DataFrame to tkinter object
I am trying to create a Pandas' DataFrame GUI in tkinter that would update the moment the user changes the value of the cell (each cell is an Entry). 我正在尝试在tkinter中创建一个熊猫的DataFrame GUI,以在用户更改单元格的值(每个单元格是一个Entry)的时刻更新。 I thought that converting the DataFrame into tkinter variables (tk.StringVar, tk.IntVar...) would be the best way to achieve that.
我认为将DataFrame转换为tkinter变量(tk.StringVar,tk.IntVar ...)将是实现此目标的最佳方法。
My problem: I am not sure how to convert dataframe into those objects. 我的问题:我不确定如何将数据帧转换为那些对象。 I tried using the astype function, but it doesn't seem to convert the type.
我尝试使用astype函数,但它似乎无法转换类型。
My questions: 1) how to convert dataframe into tkinter variables? 我的问题:1)如何将数据框转换为tkinter变量?
2) is converting dataframe into ttkinter variables the best way to make the dataframe update instantly? 2)将数据框转换为ttkinter变量是使数据框立即更新的最佳方法吗?
I think pandas
can't use StringVar
as dtype
. 我认为
pandas
不能将StringVar
用作dtype
。
You would have to get every element in dataframe and create separated var = StringVar(value=df[row,col])
(or var = StringVar() ; var.set(df[row,col]))
) and keep them in standard list. 您将必须获取数据帧中的每个元素,并创建单独的
var = StringVar(value=df[row,col])
(或var = StringVar() ; var.set(df[row,col]))
)并将其保留在标准清单。
But you could put values directly to Entry
, and bind()
event to Entry
which will execute function everytime something change in Entry
or you press Enter
. 但是,你可以把值直接
Entry
,并bind()
事件Entry
将在执行功能的东西,每次改变Entry
或按Enter
。 This function could copy value from Entry
to dataframe
. 该函数可以将值从
Entry
复制到dataframe
。
EDIT: example code 编辑:示例代码
It changes value in dataframe
when you click Enter
(or Enter
on keypad) in any Entry
. 它改变的价值
dataframe
,当你点击Enter
(或Enter
键盘上)在任何Entry
。
import pandas as pd
import tkinter as tk
df = pd.DataFrame([[1,2,3], [5,6,7], [101,102,103]])
# --- functions ---
def change(event, row, col):
# get value from Entry
value = event.widget.get()
# set value in dataframe
df.iloc[row,col] = value
print(df)
# --- main --
root = tk.Tk()
# create entry for every element in dataframe
rows, cols = df.shape
for r in range(rows):
for c in range(cols):
e = tk.Entry(root)
e.insert(0, df.iloc[r,c])
e.grid(row=r, column=c)
# ENTER
e.bind('<Return>', lambda event, y=r, x=c: change(event,y,x))
# ENTER on keypad
e.bind('<KP_Enter>', lambda event, y=r, x=c: change(event,y,x))
# start program
root.mainloop()
To change value in dataframe with every key press use <KeyRelease>
要通过每次按键更改数据
<KeyRelease>
值,请使用<KeyRelease>
(it works when you press Ctrl+V
too, so you can paste data from clipboard) (它也可以在按
Ctrl+V
时起作用,因此可以从剪贴板粘贴数据)
for r in range(rows):
for c in range(cols):
e = tk.Entry(root)
e.insert(0, df.iloc[r,c])
e.grid(row=r, column=c)
e.bind('<KeyRelease>', lambda event, y=r, x=c: changed(event, y,x))
EDIT: example as class DataFrameEdit(tk.Frame) 编辑:作为类DataFrameEdit(tk.Frame)的示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.