簡體   English   中英

pysimplegui 表多行文本處理

[英]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.Treettk.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM