在文本框(两个文件py)中打印控制台结果



在Test.py文件的Tkinter窗口中,我想在textobox中显示Python控制台中打印的内容。

通过单击按钮,您可以在Test.py文件中启动一个函数,该函数调用X.py和Y.py脚本(更确切地说是它们的函数(。脚本的结果在Python控制台中正确打印:首先打印X文件的结果,然后在打印Y文件的结果之后立即打印。

我希望看到这些X.py和Y.py结果打印在文本框中。当然,如果可能的话,我也想隐藏(根本不打开(Python控制台。我在网站上读到了一些问题,但没能完成。为了提供信息,我已经解释了我创建的目的,因此粘贴已经在工作的各种函数的整个代码是没有用的。你能帮我看一下在textobox中查看脚本结果的代码吗?

当然,如果可能的话,我也想隐藏(根本不打开(Python控制台

#IMPORT OF FILE X AND Y, AND RELATED FUNCTIONS
from File.X import Example_Name_Function_1
from File.Y import Example_Name_Function_2
#TEXTOBOX
text = tk.Text(test,width=80,height=50,  background="black", foreground="white")
text.pack()
text.place(x=450, y=20)
text.insert(INSERT, "aaaaaaaan")
text.insert(END, " bbbbbbbb n")
#BUTTON
button = Button(test, text="Go", foreground='black', command= Go)
button.place(x=7, y=512)

代码更新

我已经报告了初始代码。现在,窗口立即打开,只有在单击按钮后才能开始刮擦。因此,抓取的结果将打印在Python终端控制台中。不在文本框中。由于代码太长,我更喜欢这样报告。但在@Matiss的代码中,但它不起的作用

#I open tkinter window for scraping
editmenu.add_command(label='Scraping', command=filename.draw_graph)

_

#WINDOW SCRAPING
from tkinter import *
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from PIL import ImageTk, Image
from File import Scraping_Nome_Campionati
from File import Scraping_Nome_Squadre_MIO
import subprocess

def draw_graph():
test_scraping=tk.Toplevel()
test_scraping.title("Scraping")
test_scraping.geometry("1100x900")
test_scraping.configure(bg='#282828')

#I call up and open the two scripts for scraping (no tkinter)
def do_scraping():

msg1 = Scraping_Nome_Campionati.scraping_nome_campionati_e_tor()
if msg1:
message1.configure(text=msg1)
message1.configure(foreground="red")
vuoto_elenco_campionati.config(image=render7)

else:
vuoto_elenco_campionati.config(image=render8)
message1.configure(foreground="green")

msg2 = Scraping_Nome_Squadre_MIO.scraping_nome_squadre_e_tor()
if msg2:
message2.configure(text=msg2)
message2.configure(foreground="red")
vuoto_elenco_squadre.config(image=render7)
else:
vuoto_elenco_squadre.config(image=render8)
message2.configure(foreground="green")

#YOUR CODE
def call_obj_from(obj, module):
if module:
proc = subprocess.Popen(['python3', '-c', f'from {module} import {obj}; {obj}()'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return proc.communicate()[0].decode()

text.insert('end', call_obj_from('scraping_nome_campionati_e_tor', 'File.Scraping_Nome_Campionati'))
text.insert('end', call_obj_from('scraping_nome_squadre_e_tor', 'file.Scraping_Nome_Squadre_MIO'))  
text = tk.Text(test_scraping,width=80,height=50,  background="black", foreground="white")
text.pack()
text.place(x=450, y=20)
text.insert(INSERT, "aaaaaan")
text.insert(END, "bbbbbbbbbn")

button = Button(test_scraping, text="Avvia", bg='#e95420', foreground='white', command=do_scraping)
button.place(x=116, y=512)
test_scraping.mainloop()

代码上传2

# Text widget with file-like object feature
class TextOut(tk.Text):
def __init__(self, master, **kw):
super().__init__(master, **kw)
# required output function for a file-like object
def write(self, message):
self.insert("insert", message)

def do_scraping():
# temporarily redirect sys.stdout
with redirect_stdout(text) as f:
scraping_nome_campionati_e_tor()
scraping_nome_squadre_e_tor()
print("completed") # this shows in the text box as well
print("done") # this will show in console instead of text box

msg1 = Scraping_Nome_Campionati.scraping_nome_campionati_e_tor()
if msg1:
message1.configure(text=msg1)
message1.configure(foreground="red")
vuoto_elenco_campionati.config(image=render7)

else:
vuoto_elenco_campionati.config(image=render8)
message1.configure(foreground="green")

msg2 = Scraping_Nome_Squadre_MIO.scraping_nome_squadre_e_tor()
if msg2:
message2.configure(text=msg2)
message2.configure(foreground="red")
vuoto_elenco_squadre.config(image=render7)
else:
vuoto_elenco_squadre.config(image=render8)
message2.configure(foreground="green")

text = TextOut(test_scraping,width=80,height=50,  background="black", foreground="white")
text.pack()
text.place(x=450, y=20)

button = Button(test_scraping, text="Avvia", bg='#e95420', foreground='white', command=do_scraping)
button.place(x=116, y=512)

对于Python 3.4+,您可以使用contextlib.redirect_stdout(请参阅官方文档(将sys.stdout临时重定向到另一个文件或类似文件的对象。

import tkinter as tk
from contextlib import redirect_stdout
from File.X import Example_Name_Function_1
from File.Y import Example_Name_Function_2
# Text widget with file-like object feature
class TextOut(tk.Text):
def __init__(self, master, **kw):
super().__init__(master, **kw)
# required output function for a file-like object
def write(self, message):
self.insert("insert", message)

def Go():
# temporarily redirect sys.stdout
with redirect_stdout(text) as f:
Example_Name_Function_1()
Example_Name_Function_2()
print("completed") # this shows in the text box as well
print("done") # this will show in console instead of text box
test = tk.Tk()
# use TextOut instead of normal Text widget
text = TextOut(test, width=80, height=50, bg="black", fg="white")
text.pack()
button = tk.Button(test, text="Go", command=Go)
button.pack()
test.mainloop()

好吧,经过一番尝试和错误,我终于找到了一种方法来实现你想要的(公平地说,你是应该经历这个阶段并展示你失败的尝试的人,或者我也不介意,因为我也学了东西(:

from tkinter import Tk, Text
import subprocess

def call_obj_from(obj, module):
if module:
proc = subprocess.Popen(['python', '-c', f'from {module} import {obj}; {obj}()'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return proc.communicate()[0].decode()

root = Tk()
text = Text(root)
text.pack()
text.insert('end', call_obj_from('example_func_1', 'file.x'))
text.insert('end', call_obj_from('example_func_2', 'file.y'))
root.mainloop()

简单地说,这两个参数是obj,或者换句话说,你想要执行的,它也会打印一些东西到控制台,还有module,它是对象所在的文件,所以例如,在这种情况下,我必须在同一目录中有一个名为functions.py的文件,其中应该有一个名称为func()的函数

最新更新