0

我有看起来像这样的数据。

tempList2=[{'Date': '21-Aug-2019', 'Day': 'Sunday', 'Status': 'This is the message. It should be wrapped!!'}, {'Date': '22-Aug-2019', 'Day': 'Monday', 'Status': 'Message Delivered'}, {'Date': '23-Aug-2019', 'Day': 'Tuesday', 'Status': 'Invalid Data found!! Please retry'}]

接下来,我正在dataframe为该数据创建一个。之后,我使用tkinter模块来查看数据。

这是示例代码:

import pandas as pd
import tkinter as tk
a =[]
tempList2=[{'Date': '21-Aug-2019', 'Day': 'Sunday', 'Status': 'This is the message. It should be wrapped!!'}, {'Date': '22-Aug-2019', 'Day': 'Monday', 'Status': 'Message Delivered'}, {'Date': '23-Aug-2019', 'Day': 'Tuesday', 'Status': 'Invalid Data found!! Please retry'}]
for i in tempList2:
    print(i)
    print(type(i))
    b = list(i.values())
    a.append(b)
print(a)
tempList = a
df = pd.DataFrame(tempList)

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

这是我得到的输出图像:

输出图像

在输出中,数据不会被打包。数据被破坏。我需要将数据包含在特定行中。我有很多数据要查看。所以我需要一个滚动条来访问它。帮助我提供一些解决方案来包装数据和附加到整个窗口的滚动条。

4

1 回答 1

0

正如@stovfl 所推荐的,您可以使用tk.Text,它通过WORD关键字参数支持自动换行。

tk.Text(root, height=col_height, width=col_width, wrap=tk.WORD)

需要处理的两个问题:

  1. 将一行中所有列的高度调整为相同。
    • 您可以找到一行中最大的字符串,并据此确定列的高度。
  2. Enter键上,文本字段会将光标向下移动,有时会隐藏文本。
    • 剥离文本并更新Enter键上的列。

在此处输入图像描述

代码

# ...

def change(event, row, col):
    # get value from Entry
    value = event.widget.get("1.0", tk.END)
    # update column & set value in dataframe
    event.widget.delete("1.0", tk.END)
    event.widget.insert("1.0", value.strip())
    df.iloc[row, col] = value.strip()
    print(df)


root = tk.Tk()

rows, cols = df.shape

col_width = 30

for r in range(rows):
    longest_string = max(df.loc[r].values, key=len)
    # If you know last element will be longest,
    # No need to calculate longest string
    # col_height = len(df.loc[r].values[-1])//col_width +1
    col_height = len(longest_string)//col_width + 1
    # or int(len(col_text)/col_width)+1
    for c in range(cols):
        col_text = df.iloc[r, c]
        e = tk.Text(root, height=col_height, width=col_width, wrap=tk.WORD)
        e.insert("1.0", df.iloc[r, c])
        e.grid(row=r, column=c)
        e.bind('<Return>', lambda event, y=r, x=c: change(event, y, x))
        e.bind('<KP_Enter>', lambda event, y=r, x=c: change(event, y, x))

# ...
于 2019-09-15T22:10:27.193 回答