当前位置: 首页 > 面试题库 >

将stdout重定向到tkinter文本小部件

长孙瑞
2023-03-14
问题内容

我正在尝试将函数的标准输出重定向到tkinter文本小部件。我遇到的问题是,它会将每一行写到一个新窗口中,而不是将所有内容都列出在一个窗口中。该函数扫描目录并列出任何0k文件。如果没有文件为0k,则将其打印出来。因此,问题在于,如果目录中有30个0k文件,它将打开30个窗口,每个窗口只有一行。现在,我知道问题出在哪里。如果您查看我的功能代码,Zerok()我会告诉您:

if os.stat(filename).st_size==0:  
       redirector(filename)

我知道,每次os.stat看到文件为0k时,它都会将其发送到重定向器,这就是为什么每个文件都有一个新窗口的原因。我只是不知道如何解决它。完整的代码如下。谢谢您的帮助。

import Tkinter
from Tkinter import *
import tkFileDialog

class IORedirector(object):
    '''A general class for redirecting I/O to this Text widget.'''
    def __init__(self,text_area):
        self.text_area = text_area

class StdoutRedirector(IORedirector):
    '''A class for redirecting stdout to this Text widget.'''
    def write(self,str):
        self.text_area.write(str,False)

def redirector(inputStr):
    import sys
    root = Tk()
    sys.stdout = StdoutRedirector(root)
    T = Text(root)
    T.pack()
    T.insert(END, inputStr)

####This Function checks a User defined directory for 0k files
def Zerok():
    import os
    sys.stdout.write = redirector #whenever sys.stdout.write is called, redirector is called.
    PATH = tkFileDialog.askdirectory(initialdir="/",title="Please select a directory")  
    for root,dirs,files in os.walk(PATH):  
     for name in files:  
      filename=os.path.join(root,name)  
      if os.stat(filename).st_size==0:  
       redirector(filename)
      else:
          redirector("There are no empty files in that Directory")
          break

#############################Main GUI Window###########################
win = Tk()
f = Frame(win)
b1 = Button(f,text="List Size")
b2 = Button(f,text="ZeroK")
b3 = Button(f,text="Rename")
b4 = Button(f,text="ListGen")
b5 = Button(f,text="ListDir")
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
l = Label(win, text="Select an Option")
l.pack()
f.pack()
b2.configure(command=Zerok)
win.mainloop()

问题答案:

解决方法很简单:不要创建多个重定向器。重定向器的全部目的是创建一次,然后普通打印语句将显示在该窗口中。

您需要对功能进行一些小的更改redirector。首先,它不应该调用Tk;相反,它应该创建一个实例,Toplevel因为tkinter程序必须恰好具有一个根窗口。其次,您必须将文本小部件传递到,IORedirector因为它需要知道要写入的确切小部件。

def redirector(inputStr=""):
    import sys
    root = Toplevel()
    T = Text(root)
    sys.stdout = StdoutRedirector(T)
    T.pack()
    T.insert(END, inputStr)

接下来,只应一次调用此函数。从那时起,要使数据出现在窗口中,您将使用普通print语句。

您可以在主要的代码块中创建它:

win = Tk()
...
r = redirector()
win.mainloop()

接下来,您需要修改write函数,因为它必须写入文本小部件:

class StdoutRedirector(IORedirector):
    '''A class for redirecting stdout to this Text widget.'''
    def write(self,str):
        self.text_area.insert("end", str)

最后,将Zerok函数更改为使用打印语句:

def Zerok():…如果os.stat(filename).st_size == 0:
print(filename)else:print(“该目录中没有空文件”)



 类似资料:
  • 问题内容: 我有一个Python程序,它执行一组操作并在STDOUT上打印响应。现在,我正在编写一个GUI,它将调用已经存在的代码,并且我想在GUI中打印相同的内容,而不是STDOUT。我将为此使用文本小部件。我不想修改执行该任务的现有代码(其他一些程序也使用此代码)。 有人可以指出我如何使用此现有任务定义并使用其STDOUT结果并将其插入文本小部件中吗?在主GUI程序中,我想调用此任务定义并将其

  • 问题内容: 我的基本程序从脚本GUI.py导入了它的GUI界面。 在我的GUI.py中: 但是它的作用是打开两个窗口,第一个窗口 (顶层 窗口 ) 按预期工作,第二个窗口 处于空闲状态 , 这是期望的,直到我单击某个按钮 ,该 按钮 在连续按下后打印数据,并且打印的数据应出现在第二个窗口的文本小部件中, 但是 不会发生,程序也没有响应,当我关闭“顶层”窗口时,会出现错误消息 “ TclError:

  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 如何在Python中将stdout重定向到任意文件? 当从ssh会话中启动运行了很长时间的Python脚本(例如,Web应用程序)并进行背景调整,并且ssh会话关闭时,该应用程序将在尝试写入stdout时引发并失败。我需要找到一种方法来使应用程序和模块输出到文件而不是stdout,以防止由于而导致失败。当前,我使用将输出重定向到文件,并且可以完成工作,但是我想知道是否有一种出于好奇而无

  • 问题内容: 尝试学习tkinter和python。我想在相邻框架中显示“文本”小部件的行号 我在一个名为unpythonic的网站上看到了一个示例,但该示例假定txt的行高为6像素。 我正在尝试这样的事情: 1)将Any-KeyPress事件绑定到一个返回发生按键的行的函数: 不幸的是,这在框架上给出了一些奇怪的数字。有没有更简单的解决方案?如何处理呢? 问题答案: 我有一个相对简单的解决方案,但

  • 问题内容: 我想从Groovy程序中执行foo.bat,并将生成的进程的输出重定向到stdout。Java或Groovy代码示例都可以。 foo.bat可能需要花费几分钟才能运行并生成大量输出,因此我希望在生成后立即查看输出,而不是必须等到该过程完成之后才能立即查看所有输出。 问题答案: 它使用一个类读取执行的程序生成的所有输出,并将其显示在其自己的stdout中。