【问题标题】:Converting Pandas DataFrame to tkinter object将 Pandas DataFrame 转换为 tkinter 对象
【发布时间】:2017-12-08 14:53:10
【问题描述】:

我正在尝试在 tkinter 中创建一个 Pandas 的 DataFrame GUI,它会在用户更改单元格的值时更新(每个单元格都是一个条目)。我认为将 DataFrame 转换为 tkinter 变量(tk.StringVar、tk.IntVar...)将是实现这一目标的最佳方法。

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

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

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

【问题讨论】:

  • 对于行和列中的每个元素,您必须执行var = StringVar(value=df[row,col])var = StringVar() ; var.set(df[row,col])) 并保留在标准列表中。我认为pandas 不能使用StringVar 作为dtype
  • 您可以将值直接放入Entry,并将bind() 事件放入Entry,这将在Entry 发生变化时执行函数。此函数可以将值从Entry 复制到dataframe。或者您可以添加Button(即带有文本"Save")并仅在单击按钮时将数据从所有Entry复制到dataframe

标签: python pandas user-interface tkinter


【解决方案1】:

我认为pandas 不能将StringVar 用作dtype

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

但是您可以将值直接输入到Entry,并将bind() 事件输入到Entry,这将在Entry 发生变化或按下Enter 时执行函数。此函数可以将值从Entry 复制到dataframe


编辑:示例代码

当您在任何Entry 中单击Enter(或键盘上的Enter)时,它会更改dataframe 中的值。

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()

要在每次按键时更改数据框中的值,请使用 &lt;KeyRelease&gt;

(按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))

编辑:例如class DataFrameEdit(tk.Frame)

【讨论】:

  • 这正是我想要的。谢谢
猜你喜欢
  • 2015-09-15
  • 2017-01-13
  • 2019-01-14
  • 1970-01-01
  • 2014-10-05
  • 2022-07-28
  • 2019-02-04
  • 2017-03-17
  • 2017-03-23
相关资源
最近更新 更多