prefer.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import tkinter as tk
  2. from tkinter import ttk
  3. from utils.config import config
  4. class PreferUI:
  5. def init_ui(self, root=None):
  6. """
  7. Init prefer UI
  8. """
  9. frame_location_isp = tk.Frame(root)
  10. frame_location_isp.pack(fill=tk.X)
  11. frame_location_isp_column1 = tk.Frame(frame_location_isp)
  12. frame_location_isp_column1.pack(side=tk.LEFT, fill=tk.Y)
  13. frame_location_isp_column2 = tk.Frame(frame_location_isp)
  14. frame_location_isp_column2.pack(side=tk.RIGHT, fill=tk.Y)
  15. self.location_label = tk.Label(
  16. frame_location_isp_column1, text="归属地:", width=12
  17. )
  18. self.location_label.pack(side=tk.LEFT, padx=4, pady=8)
  19. self.location_entry = tk.Entry(frame_location_isp_column1, width=24)
  20. self.location_entry.pack(side=tk.LEFT, padx=4, pady=8)
  21. self.location_entry.insert(0, ",".join(config.location))
  22. self.location_entry.bind("<KeyRelease>", self.update_location)
  23. self.isp_label = tk.Label(
  24. frame_location_isp_column2, text="运营商:", width=12
  25. )
  26. self.isp_label.pack(side=tk.LEFT, padx=4, pady=8)
  27. self.isp_entry = tk.Entry(frame_location_isp_column2, width=24)
  28. self.isp_entry.pack(side=tk.LEFT, padx=4, pady=8)
  29. self.isp_entry.insert(0, ",".join(config.isp))
  30. self.isp_entry.bind("<KeyRelease>", self.update_isp)
  31. config_options = [
  32. {"label_text": f"结果来源优先{i + 1}:", "combo_box_value": value}
  33. for i, value in enumerate(self.get_origin_type_prefer_index(config.origin_type_prefer))
  34. ]
  35. self.origin_type_prefer_options = []
  36. for i, config_option in enumerate(config_options):
  37. option = ConfigOption(root, **config_option)
  38. option.combo_box.bind(
  39. "<<ComboboxSelected>>",
  40. lambda event, opt=option, index=i: opt.update_select(event, index),
  41. )
  42. option.entry.bind("<KeyRelease>", option.update_input)
  43. self.origin_type_prefer_options.append(option)
  44. frame_prefer_ipv_type = tk.Frame(root)
  45. frame_prefer_ipv_type.pack(fill=tk.X)
  46. self.prefer_ipv_type_label = tk.Label(
  47. frame_prefer_ipv_type, text="结果协议优先:", width=12
  48. )
  49. self.prefer_ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
  50. self.prefer_ipv_type_combo = ttk.Combobox(frame_prefer_ipv_type, width=22)
  51. self.prefer_ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
  52. self.prefer_ipv_type_combo["values"] = ("IPv4", "IPv6", "自动")
  53. ipv_type_prefer = config.ipv_type_prefer
  54. if ipv_type_prefer:
  55. first_ipv_type_prefer = ipv_type_prefer[0]
  56. prefer_map = {"ipv4": 0, "ipv6": 1, "自动": 2, "auto": 2}
  57. if first_ipv_type_prefer in prefer_map:
  58. self.prefer_ipv_type_combo.current(prefer_map[first_ipv_type_prefer])
  59. self.prefer_ipv_type_combo.bind(
  60. "<<ComboboxSelected>>", self.update_ipv_type_prefer
  61. )
  62. self.ipv_type_input = []
  63. for ipv_type in ["ipv4", "ipv6"]:
  64. input = IpvNumInput(root, ipv_type)
  65. input.entry.bind("<KeyRelease>", input.update_input)
  66. self.ipv_type_input.append(input)
  67. frame_prefer_open_supply = tk.Frame(root)
  68. frame_prefer_open_supply.pack(fill=tk.X)
  69. self.open_supply_label = tk.Label(
  70. frame_prefer_open_supply, text="开启补偿模式:", width=12
  71. )
  72. self.open_supply_label.pack(side=tk.LEFT, padx=4, pady=8)
  73. self.open_supply_var = tk.BooleanVar(value=config.open_supply)
  74. self.open_supply_checkbutton = ttk.Checkbutton(
  75. frame_prefer_open_supply,
  76. variable=self.open_supply_var,
  77. onvalue=True,
  78. offvalue=False,
  79. command=self.update_open_supply,
  80. )
  81. self.open_supply_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  82. def get_origin_type_prefer_index(self, origin_type_prefer):
  83. index_list = [None, None, None, None, None]
  84. origin_type_prefer_obj = {
  85. "local": 0,
  86. "hotel": 1,
  87. "multicast": 2,
  88. "subscribe": 3,
  89. "online_search": 4,
  90. }
  91. for i, item in enumerate(origin_type_prefer):
  92. index_list[i] = origin_type_prefer_obj[item]
  93. return index_list
  94. def update_location(self, event):
  95. config.set(
  96. "Settings",
  97. "location",
  98. self.location_entry.get(),
  99. )
  100. def update_isp(self, event):
  101. config.set(
  102. "Settings",
  103. "isp",
  104. self.isp_entry.get(),
  105. )
  106. def update_ipv_type_prefer(self, event):
  107. config.set(
  108. "Settings",
  109. "ipv_type_prefer",
  110. self.prefer_ipv_type_combo.get(),
  111. )
  112. def update_open_supply(self):
  113. config.set("Settings", "open_supply", str(self.open_supply_var.get()))
  114. def change_entry_state(self, state):
  115. for option in self.origin_type_prefer_options:
  116. option.change_state(state)
  117. self.prefer_ipv_type_combo.config(state=state)
  118. for input in self.ipv_type_input:
  119. input.change_state(state)
  120. self.location_entry.config(state=state)
  121. self.isp_entry.config(state=state)
  122. self.open_supply_checkbutton.config(state=state)
  123. class IpvNumInput:
  124. def __init__(self, master, ipv_type):
  125. self.master = master
  126. self.ipv_type = ipv_type
  127. self.frame = tk.Frame(master)
  128. self.frame.pack(fill=tk.X)
  129. self.frame_column1 = tk.Frame(self.frame)
  130. self.frame_column1.pack(side=tk.LEFT, fill=tk.Y)
  131. self.frame_column2 = tk.Frame(self.frame)
  132. self.frame_column2.pack(side=tk.RIGHT, fill=tk.Y)
  133. ipv_type_text = "IPv4" if ipv_type == "ipv4" else "IPv6"
  134. self.entry_label = tk.Label(
  135. self.frame_column1, text=f"{ipv_type_text}数量:", width=12
  136. )
  137. self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
  138. self.entry = tk.Entry(self.frame_column1, width=24)
  139. self.entry.insert(0, config.ipv_limit[ipv_type])
  140. self.entry.pack(side=tk.LEFT, padx=4, pady=8)
  141. def update_input(self, event):
  142. config.set(
  143. "Settings",
  144. f"{self.ipv_type}_num",
  145. self.entry.get(),
  146. )
  147. def change_state(self, state):
  148. self.entry.config(state=state)
  149. class ConfigOption:
  150. def __init__(self, master, label_text, combo_box_value):
  151. self.master = master
  152. self.label_text = label_text
  153. self.combo_box_value = combo_box_value
  154. self.frame = tk.Frame(master)
  155. self.frame.pack(fill=tk.X)
  156. self.column1 = tk.Frame(self.frame)
  157. self.column1.pack(side=tk.LEFT, fill=tk.Y)
  158. self.column2 = tk.Frame(self.frame)
  159. self.column2.pack(side=tk.RIGHT, fill=tk.Y)
  160. self.label = tk.Label(self.column1, text=label_text, width=12)
  161. self.label.pack(side=tk.LEFT, padx=4, pady=8)
  162. self.combo_box = ttk.Combobox(self.column1, width=22)
  163. self.origin_type_prefer_obj = {
  164. "本地源": "local",
  165. "酒店源": "hotel",
  166. "组播源": "multicast",
  167. "订阅源": "subscribe",
  168. "关键字搜索": "online_search",
  169. }
  170. combo_box_values_name = list(self.origin_type_prefer_obj.keys())
  171. self.combo_box["values"] = combo_box_values_name
  172. self.combo_box.pack(side=tk.LEFT, padx=4, pady=8)
  173. origin_type_prefer = config.origin_type_prefer
  174. if not origin_type_prefer or combo_box_value is None:
  175. self.combo_box.current(None)
  176. else:
  177. self.combo_box.current(combo_box_value)
  178. self.entry_label = tk.Label(self.column2, text="数量:", width=12)
  179. self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
  180. self.entry = tk.Entry(self.column2, width=24)
  181. if origin_type_prefer and combo_box_value is not None:
  182. self.entry.insert(
  183. 0,
  184. config.source_limits[self.origin_type_prefer_obj[self.combo_box.get()]],
  185. )
  186. self.entry.pack(side=tk.LEFT, padx=4, pady=8)
  187. def update_select(self, event, index):
  188. origin_type_prefer_list = [''] * 5
  189. prefer_list = [
  190. origin.strip().lower()
  191. for origin in config.get(
  192. "Settings",
  193. "origin_type_prefer",
  194. fallback="",
  195. ).split(",")
  196. ]
  197. for i, value in enumerate(prefer_list):
  198. origin_type_prefer_list[i] = value
  199. select_value = self.origin_type_prefer_obj[
  200. self.combo_box.get()
  201. ]
  202. origin_type_prefer_list[index] = select_value
  203. self.entry.delete(0, tk.END)
  204. self.entry.insert(
  205. 0,
  206. config.source_limits[self.origin_type_prefer_obj[self.combo_box.get()]],
  207. )
  208. config.set(
  209. "Settings",
  210. "origin_type_prefer",
  211. ",".join(origin_type_prefer_list),
  212. )
  213. def update_input(self, event):
  214. config.set(
  215. "Settings",
  216. f"{self.origin_type_prefer_obj[self.combo_box.get()]}_num",
  217. self.entry.get(),
  218. )
  219. def change_state(self, state):
  220. self.combo_box.config(state=state)
  221. self.entry.config(state=state)