Browse Source

Initial python-gui commit

bryan 4 năm trước cách đây
mục cha
commit
c0c4837519
2 tập tin đã thay đổi với 116 bổ sung0 xóa
  1. 115 0
      openwrt-build-gui.py
  2. 1 0
      requirements.txt

+ 115 - 0
openwrt-build-gui.py

@@ -0,0 +1,115 @@
+#!/usr/bin/env python3
+
+import tkinter as tk
+from tkinter import filedialog
+from tkinter import ttk
+import pandas
+import gzip
+import urllib.request
+
+
+class Main(tk.Frame):
+    """This module generates information for the tkinter gui"""
+
+    def __init__(self, parent, *args, **kwargs):
+        super().__init__(parent, *args, **kwargs)
+
+        # Get Table of Hardware (toh) from openwrt.org and save to a pandas df
+        self.toh_df = self.get_toh_df()
+
+        # Target menu
+        self.target = tk.StringVar()
+        self.targets, self.target_menu = self.gen_target_menu()
+        self.target.set(self.targets[0])
+
+        # Subtarget menu
+        self.subtarget = tk.StringVar()
+        self.subtargets, self.subtarget_menu = self.gen_subtarget_menu()
+        self.subtarget.set(self.subtargets[0])
+        self.target.trace("w", lambda var_name, var_index, operation: self.gen_subtarget_menu(regen=True))
+
+        # Backup file
+        self.backup_file = tk.StringVar()
+        self.backup_file_entry = ttk.Entry(self, textvariable=self.backup_file)
+        self.backup_file_button = ttk.Button(self, text="Select backup file", command=self.open_sysbackup)
+
+        # Device Info
+        self.device_info = tk.StringVar()
+        
+
+        # Layout
+        self.target_menu.grid(row=0, column=0, sticky=(tk.W + tk.E))
+        self.subtarget_menu.grid(row=0, column=1, sticky=(tk.W + tk.E))
+        self.backup_file_entry.grid(row=1, column=1, sticky=(tk.W + tk.E))
+        self.backup_file_button.grid(row=1, column=0, sticky=(tk.W))
+        self.columnconfigure(1, weight=1)
+
+    
+    def get_toh_df(self):
+        toh_gz_handle = urllib.request.urlopen("https://openwrt.org/_media/toh_dump_tab_separated.gz")
+        toh_handle = gzip.open(toh_gz_handle)
+        toh_df = pandas.read_csv(toh_handle, sep="\t", encoding = "ISO-8859-1")
+        toh_df = toh_df[(toh_df.target.notnull()) & 
+                             (toh_df.subtarget.notnull()) &
+                             (toh_df.target != '¿') &
+                             (toh_df.subtarget != '¿')]
+        return toh_df
+        
+
+    def gen_target_menu(self, *args, **kwargs):
+        targets = sorted(set(self.toh_df.target.tolist()))
+        target_menu = ttk.OptionMenu(self, self.target, targets[0], *targets)
+        return targets, target_menu
+
+
+    def gen_subtarget_menu(self, regen=False, *args, **kwargs):
+        subtargets_df = self.toh_df[self.toh_df.target == self.target.get()]
+        subtargets = sorted(set(subtargets_df.subtarget.tolist()))
+        if regen is False:
+            subtarget_menu = ttk.OptionMenu(self, self.subtarget, subtargets[0], *subtargets)
+            return subtargets, subtarget_menu
+        else: # Regen
+            self.subtarget_menu["menu"].delete(0, "end")
+            for subtarget in subtargets:
+                self.subtarget_menu["menu"].add_command(label=subtarget, command=lambda value=subtarget: self.subtarget.set(subtarget))
+            self.subtarget.set(subtargets[0])
+
+
+    def open_sysbackup(self):
+        file = filedialog.askopenfile(mode ='r', title="Select Backup File", filetypes=[("OpenWRT sysbackup file", ".tar.gz")])
+        if file is not None:
+            self.backup_file.set(file.name)
+
+        
+
+
+class GUI(tk.Tk):
+    """Create the GUI"""
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        # Set the window properties
+        self.title("openwrt-build")
+        self.geometry("1280x960")
+        self.resizable(width=False, height=False)
+
+        # Define the UI
+        Main(self).grid(sticky=(tk.E + tk.W + tk.N + tk.S))
+        self.columnconfigure(0, weight=1)
+
+
+if __name__ == '__main__':
+    app = GUI()
+    app.mainloop()
+
+
+
+#
+#        , usecols=['brand',
+#         'model', 
+#          'supportedsincerel', 
+#           'supportedcurrentrel', 
+#          'target', 
+#        'subtarget']
+#

+ 1 - 0
requirements.txt

@@ -0,0 +1 @@
+pandas