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

如何将标准输出重定向到Tkinter文本小部件

能业
2023-03-14
问题内容

我的基本程序从脚本GUI.py导入了它的GUI界面。

old_stdout = sys.stdout

root = Tk.Tk()
root.title('Coursera-dl')
root.geometry("345x230")
app = GUI.Interface(root)
app.mainloop()

if app.button_press() == True and app.return_data():
    data = app.return_data()
    main(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])

sys.stdout = old_stdout

在我的GUI.py中:

class Interface(ttk.Frame):
    def __init__(self,parent=None):
        ttk.Frame.__init__(self,parent)
        self.parent = parent
        self.New_Window()

    def New_Window(self):
        self.newWindow = Tk.Toplevel(self.parent)
        self.app = CoreGUI(self.newWindow)


class StdoutRedirector(object):
    def __init__(self,text_widget):
        self.text_space = text_widget

    def write(self,string):
        self.text_space.insert('end', string)
        self.text_space.see('end')


class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()

    def InitUI(self):
        self.text_box = Tk.Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)

但是它的作用是打开两个窗口,第一个窗口 (顶层 窗口 按预期工作,第二个窗口 处于空闲状态这是期望的,直到我单击某个按钮 ,该
按钮 在连续按下后打印数据,并且打印的数据应出现在第二个窗口的文本小部件中, 但是
不会发生,程序也没有响应,当我关闭“顶层”窗口时,会出现错误消息

“ TclError:无效的命令名称”“ .33328904.33329104”“”

那么,如何在Text Widget中而不是在控制台中打印数据?

为了帮助您解决这个问题,我制作了一个脚本将stdout重定向到Tkinter
Text小部件,请在此处查看它的作用:-)


问题答案:

问题在于,当您调用时app.mainloop(),线程正忙于执行Tkinter主循环,因此直到退出循环之前,该语句之前的语句都不会执行。但是一旦退出mainloop,您将尝试使用Text小部件,但该小部件已被销毁。

我建议您将调用移至mainTkinter小部件的回调(我想您已经在尝试使用了app.button_press()),因此Text对象可用于显示文本。

class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()
        button = Button(self.parent, text="Start", command=self.main)
        button.grid(column=0, row=1, columnspan=2)

    def main(self):
        print('whatever')

    def InitUI(self):
        self.text_box = Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)


root = Tk()
gui = CoreGUI(root)
root.mainloop()


 类似资料:
  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两

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

  • 问题内容: 我正在尝试使用Tkinter GUI启动子进程并将其stdout / stderr输出显示到Text小部件。最初,我认为可以通过设置“ sys.stdout = text_widget”轻松将sys.stdout重定向到Text小部件,但似乎不行。出现错误:“文本实例没有属性’flush’”。 我在线检查并得到了一些解决方案,例如使用队列与子进程进行通信。但是,由于我的特殊要求,它们都

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

  • 问题内容: 我正在从另一个python脚本(A)调用python脚本(B)。 使用subprocess.call,如何将B的标准输出重定向到指定的文件? 我正在使用python 2.6.1。 问题答案: 将文件作为参数传递给:

  • 问题内容: 我正在尝试从主机系统调用docker的mysqldump,以从golang保存mysql dump。它可以与主机mysqldump正常工作,但不能与docker的mysqldump一起工作。 } 我只有非空数据库的 空mysql dump 问题答案: 解决方案是: } 没有“> dbname.sql”