将CMD结果打印到GUI文本框tkinter中

时间:2017-03-13 13:27:22

标签: python tkinter

我想在办公室分发我的程序,以便其他人可以在我不在时使用它

我的代码:

from tkinter import *
import os


top = Tk()
top.wm_title("testest")
top.minsize(width=300, height=150)
top.maxsize(width=300, height=150)

def runscript():
    os.system('python test.py')

B = Tk.Button(top, text = 'Run test', command = runscript)
B.config(width=15, height=1)
B.pack()
top.mainloop()

有什么方法可以让.py文件中的打印功能在GUI文本框而不是命令行中打印出来?

1 个答案:

答案 0 :(得分:0)

这是一个粗略的演示,展示了如何将文本字符串打印到Label。请注意,长字符串不会被包装。如果您需要,则必须通过插入\n换行符来自行换行,或使用wraplength选项中提到的test选项。或者,您可以使用Label widget代替标签来显示文字。

我的import tkinter as tk from time import sleep # A dummy `test` function def test(): # Delay in seconds delay = 2.0 sleep(delay) print_to_gui('Files currently transferring') sleep(delay) print_to_gui('Currently merging all pdfs') sleep(delay) print_to_gui('PDFs have been merged') sleep(delay) print_to_gui('Finished!\nYou can click the "Run test"\n' 'button to run the test again.') # Display a string in `out_label` def print_to_gui(text_string): out_label.config(text=text_string) # Force the GUI to update top.update() # Build the GUI top = tk.Tk() top.wm_title("testest") top.minsize(width=300, height=150) top.maxsize(width=300, height=150) b = tk.Button(top, text='Run test', command=test) b.config(width=15, height=1) b.pack() # A Label to display output from the `test` function out_label = tk.Label(text='Click button to start') out_label.pack() top.mainloop() 函数模拟“test.py”脚本中代码的操作。

time.sleep

请注意,我们通常在GUI程序中执行调用from tkinter import *,因为它会导致整个程序在睡眠发生时冻结。我在这里用它来模拟真实代码执行处理时会发生的阻塞延迟。

在不阻止正常GUI处理的Tkinter程序中执行延迟的常用方法是使用Text widget

您会注意到我已将import tkinter as tk替换为tk.Label。这意味着我们需要键入例如Label而不是import tkinter as tk,但这使代码更容易阅读,因为我们现在知道所有不同名称的来源。这也意味着我们不会使用tkinter定义的所有名称来充斥我们的​​命名空间。 from tkinter import *只为命名空间添加1个名称,clear_label在当前版本中添加136个名称。有关此重要主题的详细信息,请参阅.after method

这是一个稍微更漂亮的示例,它将新文本附加到当前的Label文本中,并带有自动换行功能。它还有一个函数import tkinter as tk from time import sleep # A Dummy `test` function def test(): # Delay in seconds delay = 1.0 clear_label() print_to_label('Files currently transferring') sleep(delay) print_to_label('Currently merging all pdfs') sleep(delay) print_to_label('PDFs have been merged') sleep(delay) print_to_label('\nFinished!\nYou can click the "Run test" ' 'button to run the test again. ' 'This is a very long string to show off word wrapping.' ) # Append `text_string` to `label_text`, which is displayed in `out_label` def print_to_label(text_string): label_text.set(label_text.get() + '\n' + text_string) # Force the GUI to update top.update() def clear_label(): label_text.set('') top.update() # Build the GUI top = tk.Tk() top.wm_title("testest") top.minsize(width=300, height=150) top.maxsize(width=300, height=350) b = tk.Button(top, text='Run test', command=test) b.config(width=15, height=1) b.pack() # A Label to display output from the `test` function label_text = tk.StringVar() out_label = tk.Label(textvariable=label_text, wraplength=250) label_text.set('Click button to start') out_label.pack() top.mainloop() 来删除Label中的所有文本。它不是直接在Label中存储文本,而是使用Why is “import *” bad?。这样可以更轻松地访问旧文本,以便我们可以附加到它。

<VideoContainer id="videoDisplay" x="-2" y="0" width="640" height="480" click="hideCanvas()"/>