openwrt-build-gui.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python3
  2. import tkinter as tk
  3. from tkinter import filedialog
  4. from tkinter import ttk
  5. import pandas
  6. import gzip
  7. import urllib.request
  8. class Main(tk.Frame):
  9. """This module generates information for the tkinter gui"""
  10. def __init__(self, parent, *args, **kwargs):
  11. super().__init__(parent, *args, **kwargs)
  12. # Get Table of Hardware (toh) from openwrt.org and save to a pandas df
  13. self.toh_df = self.get_toh_df()
  14. # Target menu
  15. self.target = tk.StringVar()
  16. self.targets, self.target_menu = self.gen_target_menu()
  17. self.target.set(self.targets[0])
  18. # Subtarget menu
  19. self.subtarget = tk.StringVar()
  20. self.subtargets, self.subtarget_menu = self.gen_subtarget_menu()
  21. self.subtarget.set(self.subtargets[0])
  22. self.target.trace("w", lambda var_name, var_index, operation: self.gen_subtarget_menu(regen=True))
  23. # Backup file
  24. self.backup_file = tk.StringVar()
  25. self.backup_file_entry = ttk.Entry(self, textvariable=self.backup_file)
  26. self.backup_file_button = ttk.Button(self, text="Select backup file", command=self.open_sysbackup)
  27. # Device Info
  28. self.device_info = tk.StringVar()
  29. # Layout
  30. self.target_menu.grid(row=0, column=0, sticky=(tk.W + tk.E))
  31. self.subtarget_menu.grid(row=0, column=1, sticky=(tk.W + tk.E))
  32. self.backup_file_entry.grid(row=1, column=1, sticky=(tk.W + tk.E))
  33. self.backup_file_button.grid(row=1, column=0, sticky=(tk.W))
  34. self.columnconfigure(1, weight=1)
  35. def get_toh_df(self):
  36. toh_gz_handle = urllib.request.urlopen("https://openwrt.org/_media/toh_dump_tab_separated.gz")
  37. toh_handle = gzip.open(toh_gz_handle)
  38. toh_df = pandas.read_csv(toh_handle, sep="\t", encoding = "ISO-8859-1")
  39. toh_df = toh_df[(toh_df.target.notnull()) &
  40. (toh_df.subtarget.notnull()) &
  41. (toh_df.target != '¿') &
  42. (toh_df.subtarget != '¿')]
  43. return toh_df
  44. def gen_target_menu(self, *args, **kwargs):
  45. targets = sorted(set(self.toh_df.target.tolist()))
  46. target_menu = ttk.OptionMenu(self, self.target, targets[0], *targets)
  47. return targets, target_menu
  48. def gen_subtarget_menu(self, regen=False, *args, **kwargs):
  49. subtargets_df = self.toh_df[self.toh_df.target == self.target.get()]
  50. subtargets = sorted(set(subtargets_df.subtarget.tolist()))
  51. if regen is False:
  52. subtarget_menu = ttk.OptionMenu(self, self.subtarget, subtargets[0], *subtargets)
  53. return subtargets, subtarget_menu
  54. else: # Regen
  55. self.subtarget_menu["menu"].delete(0, "end")
  56. for subtarget in subtargets:
  57. self.subtarget_menu["menu"].add_command(label=subtarget, command=lambda value=subtarget: self.subtarget.set(subtarget))
  58. self.subtarget.set(subtargets[0])
  59. def open_sysbackup(self):
  60. file = filedialog.askopenfile(mode ='r', title="Select Backup File", filetypes=[("OpenWRT sysbackup file", ".tar.gz")])
  61. if file is not None:
  62. self.backup_file.set(file.name)
  63. class GUI(tk.Tk):
  64. """Create the GUI"""
  65. def __init__(self, *args, **kwargs):
  66. super().__init__(*args, **kwargs)
  67. # Set the window properties
  68. self.title("openwrt-build")
  69. self.geometry("1280x960")
  70. self.resizable(width=False, height=False)
  71. # Define the UI
  72. Main(self).grid(sticky=(tk.E + tk.W + tk.N + tk.S))
  73. self.columnconfigure(0, weight=1)
  74. if __name__ == '__main__':
  75. app = GUI()
  76. app.mainloop()
  77. #
  78. # , usecols=['brand',
  79. # 'model',
  80. # 'supportedsincerel',
  81. # 'supportedcurrentrel',
  82. # 'target',
  83. # 'subtarget']
  84. #