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