Python 数据不存在';t包装在tkinter条目小部件中

Python 数据不存在';t包装在tkinter条目小部件中,python,python-3.x,tkinter,tkinter-canvas,tkinter-layout,Python,Python 3.x,Tkinter,Tkinter Canvas,Tkinter Layout,我有这样的数据 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': 'Invali

我有这样的数据

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()
将熊猫作为pd导入
将tkinter作为tk导入
a=[]
tempList2=[{'Date':'2019年8月21日','Day':'Sunday','Status':'这是邮件。它应该被包装。},{'Date':'2019年8月22日','Day':'Monday','Status':'message Delivered'},{'Date':'星期二','Status':'发现无效数据!!请重试。}]
对于tempList2中的i:
印刷品(一)
印刷品(第(i)类)
b=列表(i.值())
a、 附加(b)
印刷品(a)
圣殿骑士
df=pd.DataFrame(模板列表)
#---功能---
def更改(事件、行、列):
#从条目中获取值
value=event.widget.get()
#在数据帧中设置值
df.iloc[行,列]=值
打印(df)
#---主--
root=tk.tk()
#为dataframe中的每个元素创建条目
行,cols=df.shape
对于范围内的r(行):
对于范围内的c(cols):
e=传统条目(根)
e、 插入(0,df.iloc[r,c])
e、 网格(行=r,列=c)
#进入
e、 绑定(“”,lambda事件,y=r,x=c:change(事件,y,x))
#在键盘上输入
e、 绑定(“”,lambda事件,y=r,x=c:change(事件,y,x))
#启动程序
root.mainloop()
这是我得到的输出图像:


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

正如@stovfl推荐的那样,您可以使用,它通过
word
关键字参数支持word包装

tk.Text(root, height=col_height, width=col_width, wrap=tk.WORD)
需要处理的两个问题:

  • 将行中所有列的高度调整为相同。
    • 您可以找到行中最大的字符串,并根据该字符串确定列的高度
  • 上输入
    键,文本字段将向下移动光标,有时会隐藏文本。
    • 去除文本并更新
      Enter
      键上的列
  • 代码

    #。。。
    def更改(事件、行、列):
    #从条目中获取值
    value=event.widget.get(“1.0”,tk.END)
    #更新数据框中的列并设置值
    event.widget.delete(“1.0”,tk.END)
    event.widget.insert(“1.0”,value.strip())
    df.iloc[row,col]=value.strip()
    打印(df)
    root=tk.tk()
    行,cols=df.shape
    柱宽=30
    对于范围内的r(行):
    最长字符串=最大值(df.loc[r].值,key=len)
    #如果你知道最后一个元素最长,
    #不需要计算最长的字符串
    #col_height=len(df.loc[r].值[-1])//col_width+1
    col\u height=len(最长字符串)//col\u width+1
    #或int(len(col\u text)/col\u width)+1
    对于范围内的c(cols):
    col_text=df.iloc[r,c]
    e=tk.Text(根,高度=col\u高度,宽度=col\u宽度,换行=tk.WORD)
    e、 插入(“1.0”,df.iloc[r,c])
    e、 网格(行=r,列=c)
    e、 绑定(“”,lambda事件,y=r,x=c:change(事件,y,x))
    e、 绑定(“”,lambda事件,y=r,x=c:change(事件,y,x))
    # ...
    
    为什么不使用ttk.treeview?@1966bc,感谢您的回复。对我在tkinter列表框中使用了该树视图。但是列表框没有边框的白色背景使我的数据难以读取。因此,我改为将我的数据填入框中,这使我很容易查看…因为我是python新手,我找不到更好的解决方案。我(或其他人)可能可以帮助您,但没有安装pandas-因此我强烈建议您在问题中添加一个不需要的…@cheezyes:“数据不会被包装”:
    条目
    不支持换行,请改用。
    # ...
    
    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))
    
    # ...