[英]pysimplegui table multiline text handling
我正在從日志文件中填充一個 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)]
定義如下[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 表或Web 表接受auto_size_columns
並忽略它,特別是在QT 中,不將它用於表,而是用於樹和Web 其評論!
在檢查了他們允許的選項並查看我們是否可以將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()
output 看起來像這樣:
在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', layout, finalize=True)
tree = window['-TREE-'].Widget
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Cancel'):
break
window.close()
另一種方法更難實現,使用其他元素來模擬樹或表格,例如來自Nagaraj Tantri的示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.