import tkinter as tk import re from tkinter import ttk from tem_pip import runpip class Pip_interface(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) self.parent = parent self.parent.title("PIP Package Manager") self.gui_height = parent.winfo_reqheight() self.gui_width = parent.winfo_reqwidth() self.search_result = None self.installed_list = None self.lastest_version = None self.package_detail = None self.installed_and_lastest_list = [] self._create_panel() def _create_panel(self): nb = ttk.Notebook(self.parent) nb.pack(fill="both") self._create_search_tab(nb) self._create_installed_package_tab(nb) def _create_search_tab(self, nb): frame = ttk.Frame(nb) frame.grid() nb.add(frame, text="Search") def _create_installed_package_tab(self, nb): frame = ttk.Frame(nb) frame.grid() paned_window = ttk.PanedWindow(frame, orient="horizontal") paned_window.grid(column=0, row=0, columnspan=4) installed_package_frame = ttk.LabelFrame(paned_window, text="Installed Package") description_frame = ttk.LabelFrame(paned_window, text="Description") installed_package_frame.grid(column=0) description_frame.grid(column=1) treeview_installed_package = ttk.Treeview(installed_package_frame, columns=("Package", "Version", "Lastest"), show="headings") treeview_installed_package.heading(0, text="Package") treeview_installed_package.heading(1, text="Version") treeview_installed_package.heading(2, text="Lastest") treeview_y_scrollbar = ttk.Scrollbar(installed_package_frame, orient="vertical", command=treeview_installed_package.yview) treeview_y_scrollbar.grid(column=1, sticky="ns") treeview_installed_package.configure(yscroll=treeview_y_scrollbar.set) treeview_installed_package.grid() self._add_lastest_version_to_installed_list() self.display_data(treeview_installed_package) description_label = ttk.Label(description_frame, text="nothing now") description_label.grid() paned_window.add(installed_package_frame) paned_window.add(description_frame) update_button = ttk.Button(frame, text="Update") update_button.grid(column=2, row=1) uninstall_button = ttk.Button(frame, text="Uninstall") uninstall_button.grid(column=3, row=1) nb.add(frame, text="Installed Package") def get_data(self, command_string): # in search, option is the package name try: command, option = command_string.split(" ") except ValueError: command = command_string option = None if command == "search": status, out, err = runpip("search {}".format(option)) pattern = re.compile("(\w+.*?)\s\(([0-9a-z.]+)\)\s+-") self.search_result = pattern.findall(out) elif command == "list": if option is None: status, out, err = runpip("list") self.installed_list = out.split("\n") elif option == "--outdated": status, out, err = runpip("list --outdated") self.lastest_version = out.split("\n") elif command == "show": status, out, err = runpip("show {}".format(option)) self.package_detail = out def display_data(self, treeview): # if self.search_result is not None: # pass if self.installed_and_lastest_list is not None: for i in range(0, len(self.installed_and_lastest_list)): treeview.insert("", "end", "", values=tuple(self.installed_and_lastest_list[i])) def _add_lastest_version_to_installed_list(self): self.get_data("list") self.get_data("list --outdated") self.installed_list.pop() # do not know why got last empty item in list self.lastest_version.pop() # below code is used to clean the above two list so I can compare for update version temp_installed_list = [] installed_pattern = re.compile("(\w+.*?)\s\(([0-9a-z.]+)\)") temp_lastest_list = [] lastest_pattern = pattern = re.compile("(\w+.*?)\s\(.*?\:\s([0-9a-z.]+)\s") for i in range(0, len(self.installed_list)): temp_installed_list.insert(i, list(installed_pattern.findall(self.installed_list[i])[0])) for i in range(0, len(self.lastest_version)): temp_lastest_list.insert(i, list(lastest_pattern.findall(self.lastest_version[i])[0])) for x in range(0, len(temp_lastest_list)): for y in range(0, len(temp_installed_list)): if temp_lastest_list[x][0] == temp_installed_list[y][0]: temp_list = [ temp_installed_list[y][0], temp_installed_list[y][1], temp_lastest_list[x][1] ] self.installed_and_lastest_list.append(temp_list) else: temp_list = [ temp_installed_list[y][0], temp_installed_list[y][1], temp_installed_list[y][1] ] self.installed_and_lastest_list.append(temp_list) # end here if __name__ == "__main__": root = tk.Tk() Pip_interface(root) root.mainloop()