在线将文件中的多行文本设置为pysimplegui中的文本元素

Set multiline text from a file online to a text element in pysimplegui

所以我有这个程序可以从互联网上抓取一个文本文件,读取它,然后将解码后的文本设置为一个元素。

import PySimpleGUI as sg
import urllib.request

data = urllib.request.urlopen("link to a text file")

layout = [[sg.Text('', k='textElement')]]

window = sg.window('Foo', layout)

def setText(Text):
    for line in Text:
        decodedText = line.decode("utf-8")
        window['textElement'].update(value=decodedText)

setText(data)

while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break

window.close()

类似的东西。但它只显示文本文件的最后一行。

您正在解码每一行,然后在每一行的文本元素上调用 .update()。相反:

def setText(Text):
    decodedText = Text.read().decode("utf-8")
    window['textElement'].update(value=decodedText)

您可以阅读整个文本,对其进行解码并分配(请注意,您不应该真正使用大写字母命名函数或变量,set_textdecided_text 会更好,并且 Text 绝对应该是 text 或其他小写形式)

或者如果您有其他原因逐行执行:

def setText(Text):
    Text = ''.join(line for line in Text)
    decodedText = Text.decode("utf-8")
    window['textElement'].update(value=decodedText)

但是请注意,您的代码似乎假定它正在获取 bytes(这需要进行编码),而您获取文本似乎是有道理的(即 str) ,所以如果您仍然有问题,您可能只需要跳过解码已经解码的文本。

Text 元素的方法 update 将用新值替换全部内容,因此以下代码中只会显示最后更新。

    for line in Text:
        decodedText = line.decode("utf-8")
        window['textElement'].update(value=decodedText)

txt 文件的内容可能很大,无法放入 fixed-size 文本元素,然后需要滚动条才能查看所有内容,因此最好在此处使用多行元素。

import urllib
import PySimpleGUI as sg

url = 'https://www.python.org/humans.txt'
try:
    response = urllib.request.urlopen(url)
    if response.code == 200:
        text = response.read().decode('utf-8')
    else:
        text = 'Failed to load following file.\n'+url
except urllib.error.HTTPError:
    text = 'Failed to load following file.\n'+url

font = ('Courier New', 11)
sg.theme('DarkBlue4')
sg.set_options(font=font)

layout = [
    [sg.Multiline(text, size=(80, 10), key='Multiline')],
    [sg.Push(), sg.Button('Exit')],
]
window = sg.Window('Window Title', layout, finalize=True)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Exit'):
        break

window.close()

Jason 使用 Multiline 元素的想法是正确的。稍微扩展一下...例如,如果您想显示多个文件,您可以“打印”到多行元素。

这样您可以多次调用 set_text,结果每次都会将信息“打印”到 Multiline 元素。

import urllib
import PySimpleGUI as sg

url = 'https://www.python.org/humans.txt'

def set_text(mline:sg.Multiline, url):
    try:
        response = urllib.request.urlopen(url)
        if response.code == 200:
            text = response.read().decode('utf-8')
            mline.print(text)
        else:
            mline.print('Failed to load following file.\n'+url)
    except urllib.error.HTTPError:
        mline.print('Failed to load following file.\n'+url)

font = ('Courier New', 11)
sg.theme('DarkBlue4')
sg.set_options(font=font)

layout = [  [sg.Multiline(size=(80, 10), key='Multiline', expand_x=True, expand_y=True)],
            [sg.Push(), sg.Button('Get Example'), sg.Button('Exit')]]

window = sg.Window('Window Title', layout, resizable=True, finalize=True)

set_text(window['Multiline'], url)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Exit'):
        break
    elif event == 'Get Example':
        set_text(window['Multiline'], 'http://www.example.com')

window.close()