def createList(self): dados = self.generateHistory() campoHist = Listbox() for pos, dado in enumerate(dados): campoHist.insert( pos, f"Id: {dado[0]} - valor(contraposta): {dado[1]} - servico: {dado[2]} - aceito: {dado[3]} - situaçao: {dado[4]}" ) print() campoHist.place(relx=0.105, rely=0.180, width=450, height=200) campoHist.update()
def createList(self): dados = self.generateHistory() campoHist = Listbox() for pos, dado in enumerate(dados): campoHist.insert( pos, f"Id: {dado[0]} | Servico: {dado[1]} | valor: {dado[2]} | endereco: {dado[3]} | vagas: {dado[4]} | Descrição: {dado[-1]} " ) print() campoHist.place(relx=0.105, rely=0.180, width=450, height=200) campoHist.update()
class StartPage(ttk.Frame): """ 初始界面 """ def __init__(self, parent, mainframe): ttk.Frame.__init__(self, parent) self.mainframe = mainframe self.mainframe.title("网络测试(NetworkTest)") # 菜单栏 self.mainframe.option_add('*tearOff', FALSE) menubar = Menu(self.mainframe) self.mainframe['menu'] = menubar menu_tools = Menu(menubar) menu_help = Menu(menubar) menubar.add_cascade(menu=menu_tools, label='工具库(Tools)') menubar.add_cascade(menu=menu_help, label='帮助(H)') menu_tools.add_command(label='IP地址测试(IP Test)', command=lambda: mainframe.show_frame("StartPage")) menu_help.add_command( label='关于(About)', command=lambda: self.About_view()) menu_tools.add_command(label='网段扫描(Network scanning)', command=lambda: mainframe.show_frame("Network_scan")) menu_tools.add_command(label='自定义扫描(Auto Test)', command=lambda: mainframe.show_frame("ALL_IPtest")) # 单个地址测试 self.one_IPtest_img = ImageTk.PhotoImage(one_IPtest_image) self.IPtest = ttk.Label(self, text='IP地址测试', image=self.one_IPtest_img, compound='left', font=TITLE_FONT, foreground='#1296db') self.Ip_start = ttk.Label(self, text='输入地址:', compound='left') self.one_iptest = StringVar() self.one_Ip_Entry = ttk.Entry(self, textvariable=self.one_iptest) self.one_scanning = ttk.Button( self, text="测试", command=lambda: self.One_IPtest()) self.clear_views = ttk.Button( self, text="清空", command=lambda: self.cleane_view()) self.Stop_test = ttk.Button( self, text="停止", command=lambda: self.Stop_Popen()) self.choie_N = ttk.Label(self, text="选择测试次数:", compound='left') self.view_title = ttk.Label(self, text="测试结果", compound='left') # stop_popen self.stop_IPtest = StringVar() self.stop_IPtest.set('1') # 选择ping次数 self.count_IPtest = StringVar() self.country_one = ttk.Combobox(self, textvariable=self.count_IPtest) self.country_one.bind('<< ComboboxSelected >>', function) self.country_one['values'] = ('2', '4', '10', '100', '∞') self.count_IPtest.set('4') # 结果显示 VERTICAL = "vertical" self.Scanning_one = Listbox(self, height=20, width=100) self.ScanViews_one = ttk.Scrollbar( self, orient=VERTICAL, command=self.Scanning_one.yview) self.Scanning_one['yscrollcommand'] = self.ScanViews_one.set ttk.Sizegrip().grid(column=2, row=4, sticky="se") # 布局 self.IPtest.grid(column=0, row=0, sticky="nwes", padx=5, pady=5) self.Ip_start.grid(column=1, row=1, sticky="nwes", padx=5, pady=5) self.one_Ip_Entry.grid(column=2, row=1, sticky="nwes", padx=5, pady=5) self.choie_N.grid(column=3, row=1, sticky="nwes", padx=5, pady=5) self.country_one.grid(column=4, row=1, sticky="nwes", padx=5, pady=5) self.one_scanning.grid(column=5, row=1, sticky="nwes", padx=5, pady=5) self.view_title.grid(column=1, row=2, sticky="nwes", padx=5, pady=5) self.ScanViews_one.grid(column=21, row=3, sticky="ns") self.Scanning_one.grid( column=1, row=3, sticky="nwes", columnspan=10, padx=5, pady=5) self.Stop_test.grid(column=1, row=11, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) self.clear_views.grid(column=10, row=11, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) # 开始ping测试 def One_IPtest(self): """ 获取IP,开始Ping测试,结果实时输出到窗口 """ one_ip = self.one_iptest.get() # 获取IP count_testnum = self.count_IPtest.get() # 获取测试次数 self.stop_IPtest.set('1') if(platform.system() == 'Windows'): # Windows系统 if count_testnum == '∞': add_num = "ping -t -w 600 " else: add_num = "ping -n {0} -w 600 ".format(count_testnum) cmd = add_num+"{0}".format(one_ip) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) while p.poll() is None: control = self.stop_IPtest.get() if control == '0': cmd_close = "taskkill /t /f /pid {0}".format(p.pid) subprocess.Popen(cmd_close, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) break else: line = p.stdout.readline().strip().decode('gbk') if line: Time_Print = str(datetime.datetime.now()) Test_Print = Time_Print+':'+line self.Scanning_one.insert('end', Test_Print) self.Scanning_one.update() for i in range(5): line = p.stdout.readline().strip().decode('gbk') Time_Print = str(datetime.datetime.now()) if line: Test_Print = Time_Print+':'+line else: Test_Print = line self.Scanning_one.insert('end', Test_Print) self.Scanning_one.update() elif(platform.system() == 'Linux'): # Linux系统 if count_testnum == '∞': add_num = "ping -w 10 " else: add_num = "ping -c {0} -w {0} ".format(count_testnum) cmd = add_num+"{0}".format(one_ip) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) while p.poll() is None: control = self.stop_IPtest.get() if control == '0': cmd_close = "pkill -9 {0}".format(p.pid) subprocess.Popen(cmd_close, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) break else: line = p.stdout.readline().strip().decode('utf-8') if line: Time_Print = str(datetime.datetime.now()) Test_Print = Time_Print+':'+line self.Scanning_one.insert('end', Test_Print) self.Scanning_one.update() for i in range(5): line = p.stdout.readline().strip().decode('utf-8') Time_Print = str(datetime.datetime.now()) if line: Test_Print = Time_Print+':'+line else: Test_Print = line self.Scanning_one.insert('end', Test_Print) self.Scanning_one.update() else: messagebox.showinfo('不支持该操作系统!') def cleane_view(self): self.Scanning_one.delete('0', 'end') def Stop_Popen(self): self.stop_IPtest.set('0') def About_view(self): messagebox.showinfo('网络测试', """ 版本: 0.2 日期: 2019-02-05 11:30 Python: 3.7.0 源码发布于: https://github.com/ErickQian/NetworkScanning """)
class ALL_IPtest(ttk.Frame): """ 任意IP地址扫描 扫描结显示到窗口 也可以选择导出到文本文件 """ def __init__(self, parent, mainframe): ttk.Frame.__init__(self, parent) self.mainframe = mainframe # 获取图片 self.ALLIP_img = ImageTk.PhotoImage(ALL_IPimg_image) self.infile_img = ImageTk.PhotoImage(infile_image) self.outFile_img = ImageTk.PhotoImage(outFile_image) self.go_img = ImageTk.PhotoImage(go_image) self.IPtest = ttk.Label(self, text='自定义扫描', image=self.ALLIP_img, compound='left', font=TITLE_FONT, foreground='#1296db') self.Get_IPtxt = ttk.Button(self, text="导入IP文件", image=self.infile_img, compound='left', command=lambda: self.start_ping()()) self.Go_Scanning = ttk.Button(self, text="开始扫描", image=self.go_img, compound='left') self.Out_ScanningTxt = ttk.Button(self, text="导出结果", image=self.outFile_img, compound='left', command=lambda: self.save_view()) self.Clean_ScanningTxt = ttk.Button(self, text="清空", command=lambda: self.cleane_view()) self.TestView = ttk.Label(self, text='扫描结果:', font=TITLE_FONT, foreground='#1296db') self.ping_test = [] # 结果显示 VERTICAL = "vertical" self.Scanning_L = Listbox(self, height=20, width=100) self.ScanViews = ttk.Scrollbar(self, orient=VERTICAL, command=self.Scanning_L.yview) self.Scanning_L['yscrollcommand'] = self.ScanViews.set ttk.Sizegrip().grid(column=2, row=4, sticky="se") self.ScanViews.grid(column=21, row=3, sticky="ns") self.Scanning_L.grid(column=1, row=3, sticky="nwes", columnspan=20, padx=5, pady=5) self.IPtest.grid(column=0, row=0, sticky="nwes", padx=5, pady=5) self.Get_IPtxt.grid(column=1, row=1, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) self.Go_Scanning.grid(column=2, row=1, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) self.Out_ScanningTxt.grid(column=20, row=20, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) self.Clean_ScanningTxt.grid(column=1, row=20, sticky="nwes", columnspan=1, rowspan=1, padx=5, pady=5) self.TestView.grid(column=1, row=2, sticky="nwes", padx=5, pady=5) # 获取IP def check_file(self): """ askopenfilename获取IP地址文件 """ self.open_filename = askopenfilename(title='打开文件', filetypes=[('All Files', '*')]) with open(self.open_filename, 'r') as f: self.startip = f.readlines() return (self.startip) # 处理IP def start_ping(self): """ 启动多线程 检查IP地址合法性 """ get_ALLip = self.check_file() pthread_list = [] self.Scanning_L.insert( 'end', '时间 IP地址 测试次数 通信状态' ) for line in get_ALLip: if len(line.strip()): ip = line.strip('\n') # 开始测试 pthread_list.append( threading.Thread(target=self.get_ping_result, args=(ip, ))) for item in pthread_list: item.setDaemon(True) item.start() self.ping_test = [['时间', 'IP地址', 'Ping次数', '通信情况']] def get_ping_result(self, ip): """ 检查对应的IP是否被占用 """ cmd_str = "ping {0} -n 4 -w 600".format(ip) DETACHED_PROCESS = 0x00000008 # 不创建cmd窗口 time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: subprocess.run(cmd_str, creationflags=DETACHED_PROCESS, check=True) # 仅用于windows系统 except subprocess.CalledProcessError as err: self.Scanning_L.insert( 'end', '%s %s 4 通信失败' % (str(time_now), ip)) self.ping_test.append([time_now, ip, 4, '通信失败']) else: self.ping_test.append([time_now, ip, 4, '通信正常']) self.Scanning_L.insert( 'end', '%s %s 4 通信正常' % (str(time_now), ip)) self.Scanning_L.update() def cleane_view(self): self.Scanning_L.delete('0', 'end') def save_view(self): PingTest = xlwt.Workbook() # 新建一个excel sheet = PingTest.add_sheet('Ping测试数据结果') # 添加一个sheet页 row = 0 # 控制行 for stu in self.ping_test: col = 0 # 控制列 for s in stu: # 再循环里面list的值,每一列 sheet.write(row, col, s) col += 1 row += 1 PingTest.save('Ping测试数据结果.xls') # 保存到当前目录下 messagebox.showinfo('提示', '数据已导出到程序可执行文件目录下的(Ping测试数据结果.xls)文件中!')
class ConfigMgr(Dialog): def __init__(self, x, y, board): self.root = Toplevel() self.root.title("Config Manager") self.board = board f1 = Frame(self.root) f2 = Frame(self.root) f3 = Frame(f2) f1.pack(side=LEFT) f2.pack(side=LEFT) f3.pack(side=TOP) self.listbox = Listbox(f1) self.files = [] self.loadFileList() self.listbox.pack() l1 = Label(f3, text="new File name:") l1.pack(side=LEFT) self.e = Entry(f3) self.e.delete(0, END) self.e.insert(0, "FILENAME") self.e.pack(side=LEFT) buttons = [] buttons.append( Button(f2, text="Save to selected", command=self.saveConf)) buttons.append( Button(f2, text="Save to new File", command=self.newConf)) buttons.append( Button(f2, text="Load selected File", command=self.loadConf)) buttons.append( Button(f2, text="Delete selected File", command=self.delConf)) buttons.append(Button(f2, text="Continue", command=self.root.destroy)) for b in buttons: b.pack(side=TOP) self.align(x, y) self.root.mainloop() def loadFileList(self): if (not os.path.exists("./CONF")): os.mkdir("./CONF") self.files = os.listdir("./CONF/") self.listbox.delete(0, END) for item in self.files: self.listbox.insert(END, item) self.listbox.selection_set(0) self.listbox.update() def saveConf(self): f = open(self.listbox.selection_get(), "wb") data = BoardConfig(copy(self.board)) data_b = pickle.dumps(data) f.write(data_b) f.close() self.loadConf() def newConf(self): f = open("./CONF/" + self.e.get(), "wb") data = BoardConfig(copy(self.board)) data_b = pickle.dumps(data) f.write(data_b) f.close() self.loadFileList() print(self.files) f = open("./CONF/" + self.e.get(), "rb") data_b = f.read() data = pickle.loads(data_b) data.load(self.board) f.close() self.redraw(0) def loadConf(self): f = open("./CONF/" + self.listbox.selection_get(), "rb") data_b = f.read() data = pickle.loads(data_b) data.load(self.board) f.close() self.redraw(0) def delConf(self): MsgBox = messagebox.askquestion( 'WARNING', 'Are you sure you want to delete this file?', icon='warning') if (MsgBox == "yes"): os.remove("./CONF/" + self.listbox.selection_get()) self.loadFileList() self.root.lift() def redraw(self, p): self.board.setHighlight(p) self.board.drawBoard(320, 320) self.board.drawPieces()
class Server(Tk): """ TPC server getting messages and sending it to differents rooms """ def __init__(self): # Initialisation de l'héritage Tk.__init__(self) # Création des objets du serveur self.conn = socket(AF_INET, SOCK_STREAM) self.logger = logger.Logger(self, directory=LOG_FOLDER) self.logger.log(0, "Initialising the server") # Création des salles du serveur self.room_names = [] self.rooms = {} self.bans = {} self.clients = [] # Création des files d'attente du serveur self.send_queue = Queue() self.recv_queue = Queue() self.accept_conn_queue = Queue() # Initialisation des attributs d'étât du serveur self.running = True self.selected_room = None # Initialisation des travailleurs chinois jaunes du serveur self.workers = [ Thread(target=self.serve_forever), Thread(target=self.accept_conn), Thread(target=self.process_sending), Thread(target=self.process_messages) ] # Initialisation de la liste des salles de la GUI self.room_list = Listbox(self) # Initialisation de la liste des clients de la GUI self.client_list = Listbox(self) self.ban_list = Listbox(self) # Initialisation de la zone de commande de la GUI self.input_frame = Frame(self) self.input_label = Label(self.input_frame, text=">>") self.input_command = Entry(self.input_frame, width=150) # Affchage des différents éléments self.client_list.grid(row=0, column=0, rowspan=3, sticky="nsew") self.ban_list.grid(row=0, column=1, rowspan=3, sticky="nsew") self.input_label.grid(row=0, column=0, sticky="nsew") self.input_command.grid(row=0, column=1, sticky="nsew") self.input_frame.grid(row=3, column=0, columnspan=3, sticky="nsew") self.logger.grid(row=0, column=2, sticky="nsew") self.room_list.grid(row=1, rowspan=2, column=2, sticky="nsew") # Initialisation des salles for room in listdir(BAN_FOLDER): self.add_room(room[:-5]) def add_room(self, room_name): self.rooms[room_name] = Room(self) self.room_names.append(room_name) self.load_banlist(room_name) self.logger.log(0, "Adding room {} to server".format(room_name)) def close_room(self, room): for client_name in self.rooms[room].clients: self.kick(room, client_name, message="Closing the room") self.save_banlist(room) self.logger.log(0, "Closing room {}".format(room)) def accept_conn(self): while self.running: if not self.accept_conn_queue.empty(): try: conn, conn_infos = self.accept_conn_queue.get(timeout=0.05) except Empty: conn, conn_infos = None, None if conn and conn_infos: msg = conn.recv(9999).decode() if ";" in msg: if msg[:5] == "ASKCO": room, name = msg.split(";")[1:] if room in self.room_names: if not name in self.bans[room]: self.rooms[room].add_client( name, conn, conn_infos) self.clients.append(conn) self.logger.log( 1, "Say Hello to {} joining the server with {}" .format(name, conn_infos)) else: conn.send( "BANED;Your are baned from this server" .encode()) conn.close() self.logger.log( 2, "Client {} tryied to come but probably forget that he was baned" .format(name)) else: self.add_room(room) self.rooms[room].add_client( name, conn, conn_infos) self.clients.append(conn) self.logger.log( 1, "Say Hello to {} joining the server with {}" .format(name, conn_infos)) else: conn.send("KICKD;Bad indetifying".encode()) conn.close() self.logger.log( 2, "Something tryed to access server without identifying itself" ) else: conn.send("KICKD;Bad indetifying".encode()) conn.close() self.logger.log( 2, "Something tryed to access server without identifying itself" ) self.logger.log(1, "Server stop accept connection") def connected(self, client_name): for room in self.room_names: if client_name in self.rooms[room].clients: return True, room return False, None def kick(self, room, client_name, message=""): if self.connected(client_name)[0]: self.rooms[room].send("KICKD;{}".format(message), client_names=[client_name]) self.rooms[room].remove_client(client_name) self.logger.log( 1, "Kicking [{}] from room [{}]".format(client_name, room)) def ban(self, room, client_name, message=""): self.kick(room, client_name, message) if not client_name in self.bans[room]: self.bans[room].append(client_name) self.logger.log(2, "Banning {} from room {}".format(client_name, room)) def pardon(self, room, client_name): if client_name in self.bans[room]: self.bans[room].remove(client_name) self.logger.log( 2, "Server know how to say pardon to {} of room {}".format( client_name, room)) def send(self, msg, room, client_names=[]): self.send_queue.put((msg, room, client_names)) def load_banlist(self, room): if not exists(BAN_FOLDER): mkdir(BAN_FOLDER) self.bans[room] = [] if exists(join(BAN_FOLDER, "{}.data".format(room))): with open(join(BAN_FOLDER, "{}.data".format(room)), "r") as file: for line in file: self.bans[room].append(line[:-1]) file.close() self.logger.log(0, "Loading banlist of the room {}".format(room)) def save_banlist(self, room): if not exists(BAN_FOLDER): mkdir(BAN_FOLDER) with open(join(BAN_FOLDER, "{}.data".format(room)), "w") as file: for ban in self.bans[room]: file.write("{}\n".format(ban)) file.close() self.logger.log(0, "Save banlist of the room {}".format(room)) def process_sending(self): while self.running: if not self.send_queue.empty(): try: msg, room, client_names = self.send_queue.get(timeout=0.05) except Empty: msg, room, client_names = None, None, None if msg and room: self.rooms[room].send(msg, client_names) self.logger.log( 1, "Sending {} to room {} to clients {}".format( msg, room, client_names)) self.logger.log(1, "Server stop sending messages") def serve_forever(self): self.conn.bind(SERVER_HOST) self.logger.log(1, "Server is running on {}".format(SERVER_HOST)) self.conn.listen(5) while self.running: try: askcos, _, _ = select([self.conn], [], [], 0.05) for askco in askcos: conn, conn_infos = askco.accept() self.accept_conn_queue.put((conn, conn_infos)) except error: pass to_read = [] try: to_read, _, _ = select(self.clients, [], [], 0.05) except error: pass except ValueError: pass else: try: for conn in to_read: msg = conn.recv(9999999).decode() self.logger.log( 0, "Server recieved message '{}'".format(msg)) self.recv_queue.put(msg) except OSError: conn.close() self.logger.log(1, "Server is now offline") def start(self): self.logger.log(2, "Starting the server") for worker in self.workers: worker.start() def shutdown(self): self.running = False self.logger.log(2, "The server has been shutdowned") def stop(self): self.logger.log(2, "stopping the server") for worker in self.workers: worker.join() print("Chinois morts") for conn in self.clients: conn.close() print("Tout est fermé") self.logger.save() del self def exec_command(self, event=None): command = self.input_command.get() self.input_command.delete(0, END) self.logger.log(1, "Recieving command {} from GUI".format(command)) infos = command.split(" ") if infos[0] == "kick": self.kick(infos[1], infos[2], message="you have been kicked by the server GUI") if infos[0] == "ban": self.ban(infos[1], infos[2], message="you have been kicked by the server GUI") def process_messages(self): while self.running: if not self.recv_queue.empty(): try: msg = self.recv_queue.get(timeout=0.05) except Empty: msg = None if msg: cmd = msg.split(";") if cmd[0] == "MESSA": self.logger.log( 1, "recieved [{}] from user [{}] of room [{}]".format( cmd[3], cmd[1], cmd[2])) elif cmd[0] == "CLOSE": self.kick(cmd[1], cmd[2], "closing connection") else: pass else: pass def set_room_selection(self, event=None): room = self.room_list.curselection() if room and room != self.selected_room: self.selected_room = room[0] print(self.selected_room) def update_display(self): self.room_list.delete(0, END) self.client_list.delete(0, END) self.ban_list.delete(0, END) for i, name in enumerate(self.room_names): self.room_list.insert(i, name) if self.selected_room: self.room_list.selection_set(self.selected_room) self.room_list.update() if self.selected_room: for i, name in enumerate([ name for name in self.rooms[self.room_names[ self.selected_room]].clients.keys() ]): self.client_list.insert(i, name) self.client_list.update() for i, name in enumerate( self.bans[self.room_names[self.selected_room]]): self.ban_list.insert(i, name) self.ban_list.update() self.logger.update_display() self.input_command.update() def mainloop(self): for room in self.rooms: self.load_banlist(room) self.start() self.title("Ward-Community | Server") self.resizable(False, False) self.protocol("WM_DELETE_WINDOW", self.shutdown) self.input_command.bind("<Return>", self.exec_command) self.room_list.bind("<Button-1>", self.set_room_selection) while self.running: self.update_idletasks() self.update_display() for room in self.rooms: self.save_banlist(room) self.stop() exit()