我正在研究一个登录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模块的框架文本上显示数据?
谢谢
答案 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
语句都是微不足道的。