如何解决pysimplegui表多行文字处理
我正在从日志文件填充pySimpleGui表。大多数日志是单行的,但存在一些多行的文本。布局中的表是这样定义的
[sg.Table(key="mainTable",values=data,headings=header_list,display_row_numbers=False,col_widths=size_list,auto_size_columns=False,num_rows=40)]
当前,多行文本与下一行文本重叠。有什么方法可以在单个单元格中显示多行文本,还是只有文本剪裁?
解决方法
如果您查看他们的 QT Table 或 Web Table 接受 auto_size_columns
并在表中忽略它,特别是在 QT not using it for Table but for Tree 和 Web its commented 中!
在检查他们允许的选项并查看我们是否可以将 setWordWrap
直接应用到 QTTable 或类似应用到 Widget 上的任何内容后,甚至很难找到它。
但另一方面,他们确实有很多示例可以自定义构建表格格式:Demo_Table_Simulation.py
这是我尝试生成自定义表的内容:
#!/usr/bin/env python
import PySimpleGUI as sg
import csv
import math
# Show CSV data in Table
sg.theme('Dark Red')
def table_example():
filename = sg.popup_get_file('addresses.csv',no_window=True,file_types=(("CSV Files","*.csv"),))
# --- populate table with file contents --- #
if filename == '':
return
data = []
header_list = []
button = sg.popup_yes_no('Does this file have column names already?')
if filename is not None:
with open(filename,"r") as infile:
reader = csv.reader(infile)
if button == 'Yes':
header_list = next(reader)
try:
data = list(reader) # read everything else into a list of rows
if button == 'No':
header_list = ['column' + str(x) for x in range(len(data[0]))]
except:
sg.popup_error('Error reading file')
return
sg.set_options(element_padding=(0,0))
values = []
for row in data:
# Calculate the size of sg.Text based on the length of the text greater than some size
values.append([sg.Text(i,size=(15,math.ceil(1 if len(i) <= 15 else len(i)/15))) for i in row])
# Add a horizontal separator with length and calculate the width
length=15*len(values[0])
values.append([sg.Text('_'*length)])
input_rows = [[sg.Input(size=(15,1),pad=(0,0)) for col in range(4)] for row in range(10)]
layout = values
window = sg.Window('Table',layout,grab_anywhere=False)
event,values = window.read()
window.close()
table_example()
输出看起来像这样:
,没有在 sg.Tree
或 ttk.Treeview
中换行的选项。
据我所知,唯一的方法是在文本中插入 '\n',然后它会换行到下一行。
要显示一行中的所有行,您必须将选项 row_height
设置得足够大以适合所有行。
此处,将为 row_height
生成另一个问题。
- 如果行高太小而无法显示所有换行,您将不会看到下一行。
- 如果您将
row_height
设置得足够大,即使只有一行,您仍然会看到相同的空间占用。 - 文本将垂直居中对齐
似乎没有办法为不同的行设置行高。
这里的例子,
import textwrap
from random import randint,choice
import PySimpleGUI as sg
def wrap(string,lenght=15):
return '\n'.join(textwrap.wrap(string,lenght))
sg.theme('DarkBlue')
sg.set_options(font=('Courier New',12))
column_width = 15
word = "1234567890"*5
data = [[wrap(word[:randint(1,50)],column_width) for col in range(4)] for row in range(30)]
header_list = [f'Column {i}' for i in range(4)]
size_list = [column_width+2]*4
layout = [
[sg.Table(
key="-TREE-",values=data,headings=header_list,display_row_numbers=False,col_widths=size_list,auto_size_columns=False,num_rows=10,row_height=80,alternating_row_color='green',)],]
window = sg.Window('Tree Element Test',finalize=True)
tree = window['-TREE-'].Widget
while True:
event,values = window.read()
if event in (sg.WIN_CLOSED,'Cancel'):
break
window.close()
另一种方法更难实现,使用其他元素来模拟树或表格,例如Nagaraj Tantri
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。