繁体   English   中英

将Pandas DataFrame转换为tkinter对象

[英]Converting Pandas DataFrame to tkinter object

我正在尝试在tkinter中创建一个熊猫的DataFrame GUI,以在用户更改单元格的值(每个单元格是一个Entry)的时刻更新。 我认为将DataFrame转换为tkinter变量(tk.StringVar,tk.IntVar ...)将是实现此目标的最佳方法。

我的问题:我不确定如何将数据帧转换为那些对象。 我尝试使用astype函数,但它似乎无法转换类型。

我的问题:1)如何将数据框转换为tkinter变量?

2)将数据框转换为ttkinter变量是使数据框立即更新的最佳方法吗?

我认为pandas不能将StringVar用作dtype

您将必须获取数据帧中的每个元素,并创建单独的var = StringVar(value=df[row,col]) (或var = StringVar() ; var.set(df[row,col])) )并将其保留在标准清单。

但是,你可以把值直接Entry ,并bind()事件Entry将在执行功能的东西,每次改变Entry或按Enter 该函数可以将值从Entry复制到dataframe


编辑:示例代码

它改变的价值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()

要通过每次按键更改数据<KeyRelease>值,请使用<KeyRelease>

(它也可以在按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))

编辑:作为类DataFrameEdit(tk.Frame)的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM