在线将文件中的多行文本设置为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_text
和 decided_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()
所以我有这个程序可以从互联网上抓取一个文本文件,读取它,然后将解码后的文本设置为一个元素。
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_text
和 decided_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()