用于打印到Tkinter GUI而不是Eclipse Console的脚本

时间:2014-02-13 00:21:13

标签: python tkinter pydev

我是一名对python和tkinter感兴趣的非常新手程序员。

我已经阅读了一些关于制作基于Tk GUI的基本程序的教程。 我正在尝试将“tk模板”程序调整为基本的ping实用程序,以实现有趣/学习。我的IDE与PyDev一起日食,我的环境是gnome3 / ubuntu13.10

这是我的脚本:

#! /usr/bin/python

#import Tkinter as tk
from Tkinter import *
import pyping
#import multiprocessing

class App:
    def __init__(self,master):
        frame = Frame(master)
        frame.pack()
        self.lbl = Label(frame, text="Hello World!\n")
        self.lbl.pack()
        self.button = Button(frame, text="Quit",bg="red", fg="white", command=frame.quit)
        self.button.pack(side=LEFT)
        self.hi_there = Button(frame, text="Issue PING", command=self.do_ping)
        self.hi_there.pack(side=LEFT)

    def do_ping(self):
        pyping.ping.func_defaults = (1000, 10, 55)
        h = pyping.ping('g.co')
        for i in h.output:
            print i

#    def draw_console(self):

root = Tk()

root.title("title bar text")
root.geometry("200x100")
app = App(root)
root.mainloop()

当我点击“问题Ping”按钮

basic ping program

它将此打印到eclipse调试控制台(如预期的那样):

pydev debugger: starting

PYTHON-PING g.co (74.125.229.168): 55 data bytes
241 bytes from g.co (74.125.229.163): icmp_seq=0 ttl=52 time=94.4 ms
241 bytes from g.co (74.125.229.165): icmp_seq=1 ttl=52 time=88.7 ms
241 bytes from g.co (74.125.229.162): icmp_seq=2 ttl=52 time=89.9 ms
241 bytes from g.co (74.125.229.161): icmp_seq=3 ttl=52 time=87.9 ms
241 bytes from g.co (74.125.229.160): icmp_seq=4 ttl=52 time=89.0 ms
241 bytes from g.co (74.125.229.169): icmp_seq=5 ttl=52 time=89.8 ms
241 bytes from g.co (74.125.229.167): icmp_seq=6 ttl=52 time=87.9 ms
241 bytes from g.co (74.125.229.166): icmp_seq=7 ttl=52 time=88.6 ms
241 bytes from g.co (74.125.229.164): icmp_seq=8 ttl=52 time=87.2 ms
241 bytes from g.co (74.125.229.174): icmp_seq=9 ttl=52 time=88.9 ms

----g.co PYTHON PING Statistics----
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip (ms)  min/avg/max = 87.188/89.226/94.367

我的目标是能够在tk gui内的“文本字段”中查看控制台输出。

怎么会这样做?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是添加文本小部件,但这不是唯一的解决方案。

添加文本小部件后,将print语句替换为:

self.text_widget.insert("end", i + "\n")

请注意,在出现以下两种情况之一之前,输出不会出现:

  1. 循环结束,将控制权返回到事件循环
  2. 在循环的每次迭代期间调用self.update_idletasks,这为事件循环提供了处理重绘事件的机会。