在模块的文本中显示输出

时间:2013-08-13 04:57:24

标签: python tkinter

我正在研究一个登录motorolla调制解调器的工具,我让它工作并在python控制台上显示输出,这个工具有2部分,一部分带有gui和按钮,标签和文本框架。 我想在Gui上显示输出而不是控制台。 我怎么能做到这一点

这是文件:


来自Tkinter进口* 进口摩托罗拉

类应用程序(对象):     def init (自我):

    self.fen = Tk()
    self.fen.title("Motorola tool V 0.1")
    self.fen.geometry("720x480")


    Label(self.fen,
          text = "IP address").grid(row=0)
    #self.entree = MaxLengthEntry(self.fen, maxlength=5)
    self.entree1 = Entry(self.fen)
    self.entree1.grid(row=0, column=1)

    Label(self.fen,
          text = "Password").grid(row=2)
    #self.entree = MaxLengthEntry(self.fen, maxlength=5)
    self.entree2 = Entry(self.fen)
    self.entree2.grid(row=2, column=1)

    Button(self.fen, text = 'Connect',
           command = self.launch).grid(row = 3, column=2)

    Button(self.fen, text = 'Disconect',
           command = self.exits).grid(row = 3, column=3)
    Button(self.fen, text = 'Quit',
           command = self.fen.quit).grid(row = 5, sticky = E)


    self.output = Text(self.fen)
    self.output.grid(row = 7, column = 1)

    self.fen.mainloop()  



def launch(self):
    self.ip = self.entree1.get()
    self.passw = self.entree2.get()
    print self.ip, self.passw
    if self.passw == "":
        self.entree2.config(bg = 'red')
        self.fen.after(1000, self.empty)

    else:
        self.f = motorola.Motorola(self.ip, self.passw)
        self.f.sh_dsl()

def empty(self):
    self.entree2.configure(bg='white')


def exits(self):
    try:
        self.f.disconnect()
    except AttributeError:
        print "You are not connected"

a =应用程序()

motorola文件:

类摩托罗拉(对象):     def init (self,ip,passw):

    self.ip = ip
    self.passw = passw

    print "connect on the modem"
    self.tn = telnetlib.Telnet(self.ip, '2323' , timeout =5)
    self. tn.read_until("login: ")
    self.tn.write('radadmin\r\n')
    self.tn.read_until("Password:")
    self.tn.write(self.passw+"\r\n")
    data = self.tn.read_until(">")
    print "you are connected"
    print data,

def disconnect(self):

    self.tn.close()
    print "disconnect from the modem"

导入telnetlib


一旦我使用启动motorola模块的按钮连接调制解调器,如何在gui模块的框架文本上显示数据?

谢谢

1 个答案:

答案 0 :(得分:0)

基本思想是你必须用一些将字符串添加到GUI的代码替换每个print

诀窍是Motorola实例可能不知道如何做到这一点。所以,你要做的就是传递一些东西 - self,或self.output,或者最重要的是传递给self.output的函数(闭包)。然后Motorola代码不必知道关于Tk的任何信息(如果你以后写一个wx GUI,则不必更改);它只有一个可以调用输出字符串的函数。例如:

def outputter(msg):
    self.output.insert(END, msg + "\n")
self.f = motorola.Motorola(self.ip, self.passw, outputter)

然后,在Motorola对象中,只需存储该参数并在使用print的任何地方调用它:

def __init__(self, ip, passw, outputter):
    self.outputter = outputter
    # ...
    self.outputter("connect on the modem")

几乎可以做到这一点,但你如何处理print函数的魔术尾随逗号,甚至是多个参数或打印出数字等简单的东西?好吧,你只需要让outputter更聪明一些。您可以查看Python 3 print函数的界面以获取灵感:

def outputter(*msgs, **kwargs):
    sep = kwargs.get("sep", " ")
    end = kwargs.get("end", "\n")
    self.output.insert(END, sep.join(msgs) + end)

你可以进一步将非字符串转换为字符串(但不会破坏Unicode)等等 - 但实际上,为什么呢?如果您试图使用print或使用outputter功能过于花哨,那么您可能希望str.format执行繁重的工作......

无论如何,现在,而不是:

print data,

你这样做:

self.outputter(data, end='')

所有其他print语句都是微不足道的。