在 Tkinter 文本小部件中显示命令行结果

2023-12-25

我想要在 Tkinter 文本小部件中而不是在命令行中输出 Python 脚本。我有这个脚本https://stackoverflow.com/a/665598/3524043 https://stackoverflow.com/a/665598/3524043:

from Tkinter import *
import subprocess as sub
p = sub.Popen('./Scripts/Speedtest.py',stdout=sub.PIPE,stderr=sub.PIPE, shell=True)
output, errors = p.communicate()

root = Tk()
text = Text(root)
text.pack()
text.insert(END, output)
root.mainloop()

我已经添加shell=true在子流程中,因为我有一个OSError: [Errno 13] Permission denied.

当我运行该程序时,只有一个空文本小部件。

编辑了更好的解决方案:

导入脚本并调用对象

from Tkinter import *
from Speedtest import ping_speed, download_speed, upload_speed

root = Tk()
text = Text(root)
text.insert(INSERT, ping_speed)
text.insert(END, download_speed)
text.pack()
mainloop()

基于这个答案 https://stackoverflow.com/a/5136686/7032856你可以使用下面的代码相当简单地做到这一点:

import subprocess           # required for redirecting stdout to GUI

try:
    import Tkinter as tk    # required for the GUI python 2
except:
    import tkinter as tk    # required for the GUI python 3


def redirect(module, method):
    '''Redirects stdout from the method or function in module as a string.'''
    proc = subprocess.Popen(["python", "-c",
        "import " + module + ";" + module + "." + method + "()"], stdout=subprocess.PIPE)
    out = proc.communicate()[0]
    return out.decode('unicode_escape')

def put_in_txt():
    '''Puts the redirected string in a text.'''
    txt.insert('1.0', redirect(module.get(), method.get()))


if __name__ == '__main__':

    root = tk.Tk()

    txt = tk.Text(root)
    module = tk.Entry(root)
    method = tk.Entry(root)
    btn = tk.Button(root, text="Redirect", command=put_in_txt)

    #layout
    txt.pack(fill='both', expand=True)
    module.pack(fill='both', expand=True, side='left')
    btn.pack(fill='both', expand=True, side='left')
    method.pack(fill='both', expand=True, side='left')

    root.mainloop()

鉴于该模块位于same目录。该代码将模块(最左边的条目)中的方法或函数(最右边的条目)的控制台输出作为字符串返回。然后将该字符串放入Text http://effbot.org/tkinterbook/text.htm field.


请参阅此答案返回all脚本中的方法/函数,无需显式传递方法名称 https://stackoverflow.com/a/48039105/7032856.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Tkinter 文本小部件中显示命令行结果 的相关文章

随机推荐