
??? 這些日子在公司測試機頂盒游戲,每次啟動游戲的時候都要在windows黑色的dos窗口輸命令,非常不方便,于是借著自己剛學的一點點python+wxPython的知識,寫了這個telnet客戶端,功能比較簡單,根據需要可以再作修改。界面用wxGlade生成,本來我不喜歡wxGlade的,覺得不是很好用,但用著用著發現其實還不錯,生成的代碼也很容易和自己的代碼結合。
??? 輸入指令的輸入框有默認的指令提示,為了方便寫了個COMMAND指令列表,這是公司里用的,可以在源代碼中COMMADN列表中修改自己需要的指令,或者去掉COMMAND,直接往輸入框輸指令。
#!/usr/bin/env python # -*- coding: GB2312 -*- # @author 小星星 zyl198692@sina.com # generated by wxGlade 0.6.3 on Mon Aug 17 13:50:13 2009 import wx import telnetlib import sys # begin wxGlade: extracode # end wxGlade # 預先定義的指令列表 COMMAND=['busybox mount -t nfs -o nolock,ro,mountvers=2 192.168.1.128:/iptv /mnt','cd mnt/czy/llz/soundddz','sh run.sh'] class MyFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: MyFrame.__init__ # 初始化組件,由wxGlade產生 kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.panel_1 = wx.Panel(self, -1) self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, u"遠程登錄") self.label_2 = wx.StaticText(self.panel_1, -1, u"地址:") self.ip_ctrl = wx.TextCtrl(self.panel_1, -1, "192.168.18.11") self.label_3 = wx.StaticText(self.panel_1, -1, u"端口:") self.port_ctrl = wx.TextCtrl(self.panel_1, -1, "23") self.label_4 = wx.StaticText(self.panel_1, -1, u"用戶:") self.user_ctrl = wx.TextCtrl(self.panel_1, -1, "root") self.label_5 = wx.StaticText(self.panel_1, -1, u"密碼:") self.pwd_ctrl = wx.TextCtrl(self.panel_1, -1, "6e58f908") self.label_6 = wx.StaticText(self.panel_1, -1, u"連接信息") self.info_ctrl = wx.TextCtrl(self.panel_1, -1, "", style=wx.TE_MULTILINE) self.label_7 = wx.StaticText(self.panel_1, -1, u"發送指令") self.cmd_ctrl = wx.TextCtrl(self.panel_1, -1, "", style=wx.TE_MULTILINE) self.send_btn = wx.Button(self.panel_1, -1, u"發送指令") self.static_line_1 = wx.StaticLine(self.panel_1, -1) self.logout_btn = wx.Button(self.panel_1, -1, u"退出登錄") self.login_btn = wx.Button(self.panel_1, -1, u"遠程登錄") self.clear_btn = wx.Button(self.panel_1, -1, u"清空信息") self.exit_btn = wx.Button(self.panel_1, -1, u"退出程序") # 組件添加屬性值,由wxGlade產生 self.__set_properties() self.__do_layout() # 按鈕事件綁定,由wxGlade產生 self.Bind(wx.EVT_BUTTON, self.OnSend, self.send_btn) self.Bind(wx.EVT_BUTTON, self.OnLogout, self.logout_btn) self.Bind(wx.EVT_BUTTON, self.OnLogin, self.login_btn) self.Bind(wx.EVT_BUTTON, self.OnExit, self.exit_btn) self.Bind(wx.EVT_BUTTON, self.OnClear, self.clear_btn) # telnet連接標志 self.isconnected=False # end wxGlade # 連接遠程計算機 def connect(self): # 計數器 self.temp=0 # telnet登陸必須參數,端口默認23,這里就沒再設置 self.HOST=str(self.ip_ctrl.GetValue()) self.USER=str(self.user_ctrl.GetValue()) self.PASS=str(self.pwd_ctrl.GetValue()) self.cmd_ctrl.SetValue(COMMAND[self.temp]) # 實例化一個telnet對象 self.tn=telnetlib.Telnet() try: # 連接,出現異常則宣告連接失敗 self.tn.open(self.HOST) self.info_ctrl.AppendText("已連上遠程計算機,等待登錄...\n") return True except: self.info_ctrl.AppendText("對不起,遠程計算機連接失敗!\n") return False def login(self): # 從遠程計算機獲取登錄提示信息,需要輸入用戶名(包含"login"字符串) user_info=self.tn.expect(['login:'],5) self.info_ctrl.AppendText("反饋:"+user_info[2]+"\n") # 發送用戶名 self.tn.write(self.USER+'\n') self.info_ctrl.AppendText("登錄用戶:"+self.USER+"\n") # 從遠程計算機獲取登錄提示信息,需要輸入密碼(包含"Password"字符串) pwd_info=self.tn.expect(['Password:'],5) self.info_ctrl.AppendText("反饋:"+pwd_info[2]+"\n") # 發送密碼 self.tn.write(self.PASS+'\n') self.info_ctrl.AppendText("登錄密碼:"+self.PASS+"\n") # 如果登陸成功,會回顯用戶名,這里根據是否回顯用戶名判斷登陸是否成功 result=self.tn.expect([self.USER],5) self.info_ctrl.AppendText("反饋:"+result[2]+"\n") if result[0]==-1: self.info_ctrl.AppendText("登錄失敗,請確認用戶名和密碼!\n") return False else: self.info_ctrl.AppendText("恭喜你!登陸成功!\n") self.info_ctrl.AppendText("等待輸入指令......\n") #為了減少用戶錯誤操作,這里加了些手段 self.logout_btn.Enable(True) self.login_btn.Enable(False) self.send_btn.Enable(True) self.isconnected=True return True # 發送telnet指令 def sendCommand(self,cmd): self.send_btn.Enable(False) self.info_ctrl.AppendText("指令:"+cmd+"\n") self.tn.write(cmd+'\n') reply=self.tn.expect(['%'],5) self.info_ctrl.AppendText("反饋:"+reply[2]+"\n") self.info_ctrl.AppendText("等待輸入指令......\n") self.send_btn.Enable(True) # 退出telnet登陸 def logout(self): self.tn.close() self.info_ctrl.AppendText("成功退出登錄!\n") del self.tn self.send_btn.Enable(False) self.logout_btn.Enable(False) self.login_btn.Enable(True) self.isconnected=False # 組件屬性賦值,由wxGlade產生 def __set_properties(self): # begin wxGlade: MyFrame.__set_properties self.SetTitle("小星星遠程登錄工具") self.SetSize((618, 463)) self.info_ctrl.SetMinSize((600, 180)) self.cmd_ctrl.SetMinSize((600, 50)) self.send_btn.Enable(False) self.logout_btn.Enable(False) # end wxGlade # 界面布局,由wxGlade產生(wxGlade的確是個好東西!) def __do_layout(self): # begin wxGlade: MyFrame.__do_layout sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_3 = wx.StaticBoxSizer(self.sizer_3_staticbox, wx.VERTICAL) grid_sizer_4 = wx.GridSizer(1, 4, 0, 0) grid_sizer_3 = wx.GridSizer(1, 1, 0, 0) sizer_4 = wx.BoxSizer(wx.HORIZONTAL) sizer_8 = wx.BoxSizer(wx.HORIZONTAL) sizer_7 = wx.BoxSizer(wx.HORIZONTAL) sizer_6 = wx.BoxSizer(wx.HORIZONTAL) sizer_5 = wx.BoxSizer(wx.HORIZONTAL) sizer_5.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_5.Add(self.ip_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_4.Add(sizer_5, 1, wx.EXPAND, 0) sizer_6.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_6.Add(self.port_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_4.Add(sizer_6, 1, wx.EXPAND, 0) sizer_7.Add(self.label_4, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_7.Add(self.user_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_4.Add(sizer_7, 1, wx.EXPAND, 0) sizer_8.Add(self.label_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_8.Add(self.pwd_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_4.Add(sizer_8, 1, wx.EXPAND, 0) sizer_3.Add(sizer_4, 1, wx.EXPAND, 0) sizer_3.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_3.Add(self.info_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_3.Add(self.label_7, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_3.Add(self.cmd_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.send_btn, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) sizer_3.Add(grid_sizer_3, 1, wx.EXPAND, 0) sizer_3.Add(self.static_line_1, 0, wx.EXPAND, 0) grid_sizer_4.Add(self.exit_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_4.Add(self.clear_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_4.Add(self.logout_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_4.Add(self.login_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_3.Add(grid_sizer_4, 1, wx.EXPAND, 0) self.panel_1.SetSizer(sizer_3) sizer_2.Add(self.panel_1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) self.SetSizer(sizer_2) self.Layout() # end wxGlade # 響應"發送指令"按鈕動作,執行發送操作 def OnSend(self, event): # wxGlade: MyFrame.<event_handler> self.sendCommand(str(self.cmd_ctrl.GetValue())) self.temp=self.temp+1 if self.temp>=len(COMMAND): self.cmd_ctrl.SetValue("") else: self.cmd_ctrl.SetValue(COMMAND[self.temp]) # 響應"退出登錄"按鈕動作,執行退出登錄操作 def OnLogout(self, event): # wxGlade: MyFrame.<event_handler> self.logout() # 響應"遠程登錄"按鈕動作,執行登錄操作 def OnLogin(self, event): # wxGlade: MyFrame.<event_handler> self.connect() self.login() self.temp=0 # 響應"退出程序"按鈕動作,執行退出程序操作 def OnExit(self,event): # 當然,如果登陸的時候強制退出,為了安全,彈出提示 if self.isconnected: dlg=wx.MessageDialog(parent=None,message="如果現在退出,將會丟失遠程登錄連接,是否確認退出?",caption="警告",style=wx.OK|wx.CANCEL) if dlg.ShowModal()==wx.ID_OK: self.logout() self.Close() sys.exit() else: self.Close() sys.exit() # 響應"清空信息"按鈕動作,執行清空消息內容 def OnClear(self,event): self.info_ctrl.SetValue("") # end of class MyFrame # 主程序入口,這個也是wxGlade產生的 if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 =MyFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
