【问题标题】:pysimplegui table multiline text handlingpysimplegui 表格多行文本处理
【发布时间】:2021-02-24 22:56:23
【问题描述】:

我正在从日志文件中填充 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)] 当前,多行文本与下一行文本重叠。有没有办法在单个单元格中显示多行文本或文本裁剪是唯一的方法?

【问题讨论】:

  • 请发布您的最小可复制示例,并附上发生情况的屏幕截图。

标签: python user-interface pysimplegui


【解决方案1】:

如果您查看他们的 QT TableWeb Table 接受 auto_size_columns 并在表中忽略它,特别是在 QT not using it for Table but for TreeWeb 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()

输出看起来像这样:

【讨论】:

    【解决方案2】:

    没有选项可以在 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的示例

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多