• python实现adb辅助点击屏幕工具


    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. import re
    4. import os
    5. import time
    6. import subprocess
    7. import tkinter as tk
    8. from tkinter import messagebox
    9. from PIL import Image, ImageTk
    10. # 设置ADB路径(根据你的系统和安装路径进行调整)
    11. ADB_PATH = 'C:/Users/DHY-20210315/AppData/Local/Android/Sdk/platform-tools/adb.exe'
    12. # 设置截屏图片显示比例
    13. scl = 0.7
    14. # 创建一个GUI窗口
    15. root = tk.Tk()
    16. root.title("ADB辅助点击助手")
    17. screen_width = root.winfo_screenwidth()
    18. screen_height = root.winfo_screenheight()
    19. # 设置窗口大小
    20. window_width = 900
    21. window_height = 600
    22. x = (screen_width - window_width) // 2
    23. y = (screen_height - window_height) // 2
    24. root.geometry(f"{window_width}x{window_height}+{x}+{y}")
    25. # 函数:通过ADB截屏并显示
    26. def capture_and_display():
    27. if r_var.get() == '':
    28. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    29. return
    30. # file = str(round(time.time() * 1000)) + '.png'
    31. file = 'screencap.png'
    32. scp = '/sdcard/Pictures/' + file
    33. capture_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'screencap', scp])
    34. capture_process.wait()
    35. lsc = './' + file
    36. pull_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'pull', scp, lsc])
    37. pull_process.wait()
    38. screenshot = Image.open(lsc)
    39. width, height = screenshot.size
    40. new_width = int(width * scl)
    41. new_height = int(height * scl)
    42. screenshot = screenshot.resize((new_width, new_height), Image.ANTIALIAS)
    43. s_w = new_width + 20
    44. s_h = new_height + 50
    45. root.geometry(f"{s_w}x{s_h}+{(screen_width - s_w) // 2}+{(screen_height - s_h) // 2}")
    46. img = ImageTk.PhotoImage(screenshot)
    47. img_label.config(image=img)
    48. img_label.image = img
    49. # 函数:通过ADB点击图片
    50. def click_img(event):
    51. if r_var.get() == '':
    52. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    53. return
    54. if ck_var.get() == 1:
    55. for i in range(8):
    56. subprocess.Popen(
    57. [ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    58. time.sleep(0.01)
    59. ck_var.set(0)
    60. else:
    61. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    62. time.sleep(1)
    63. capture_and_display()
    64. # 函数:通过ADB发送按键
    65. def send_back_command():
    66. if r_var.get() == '':
    67. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    68. return
    69. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'keyevent', '4'])
    70. time.sleep(1)
    71. capture_and_display()
    72. # 函数:通过ADB发送滑动
    73. def send_slide_command(arg):
    74. if r_var.get() == '':
    75. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    76. return
    77. if arg == 1:
    78. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 1050 969 800 100'])
    79. time.sleep(1)
    80. capture_and_display()
    81. else:
    82. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 800 969 1050 100'])
    83. time.sleep(1)
    84. capture_and_display()
    85. # 函数:通过ADB获取设备名
    86. def find_device():
    87. dvs = os.popen("adb devices").readlines()
    88. dfs = ''
    89. for ss in dvs:
    90. ss = ss.strip('\n')
    91. if 'List of devices' not in ss and len(ss) > 6 and 'offline' not in ss:
    92. dv = ss.split('\t')[0]
    93. p = subprocess.Popen("adb -s %s shell getprop ro.product.model" % dv, stdout=subprocess.PIPE)
    94. result = p.communicate()
    95. dn = result[0].decode('utf-8').strip()
    96. cold_bev = tk.Radiobutton(button_frame, text=dn, variable=r_var, value=dv)
    97. cold_bev.pack(side="left")
    98. if dfs == '':
    99. dfs = dv
    100. if dfs != '':
    101. r_var.set(dfs)
    102. def find_ip(input_string):
    103. ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'
    104. ip_addresses = re.findall(ip_pattern, input_string)
    105. return ip_addresses[0]
    106. # 函数:通过ADB wifi连接设备
    107. def wifi_connect():
    108. if r_var.get() == '':
    109. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    110. return
    111. dv = r_var.get()
    112. if r_var.get().startswith('192.168.'):
    113. messagebox.showinfo(title='提示', message='已经是WiFi连接了啊!')
    114. return
    115. p = subprocess.Popen("adb -s %s shell ip -f inet addr show wlan0" % dv, stdout=subprocess.PIPE)
    116. result = p.communicate()
    117. dn = result[0].decode('utf-8').strip()
    118. ip = find_ip(dn)
    119. subprocess.Popen([ADB_PATH, 'connect', ip])
    120. button_frame = tk.Frame(root)
    121. button_frame.pack()
    122. capture_button = tk.Button(button_frame, text="截屏", command=capture_and_display)
    123. capture_button.pack(side="left")
    124. tk.Label(button_frame, text=" ").pack(side="left")
    125. back_button = tk.Button(button_frame, text="后退", command=send_back_command)
    126. back_button.pack(side="left")
    127. tk.Label(button_frame, text=" ").pack(side="left")
    128. up_button = tk.Button(button_frame, text="上滑", command=lambda: send_slide_command(1))
    129. up_button.pack(side="left")
    130. tk.Label(button_frame, text=" ").pack(side="left")
    131. down_button = tk.Button(button_frame, text="下滑", command=lambda: send_slide_command(0))
    132. down_button.pack(side="left")
    133. tk.Label(button_frame, text=" ").pack(side="left")
    134. ck_var = tk.IntVar()
    135. c1 = tk.Checkbutton(button_frame, text='8连击', variable=ck_var, onvalue=1, offvalue=0)
    136. c1.pack(side="left")
    137. tk.Label(button_frame, text=" ").pack(side="left")
    138. r_var = tk.StringVar(value='')
    139. find_device()
    140. img_label = tk.Label(root)
    141. img_label.pack()
    142. img_label.bind('', click_img)
    143. wifi_button = tk.Button(button_frame, text="WiFi连接", command=wifi_connect)
    144. wifi_button.pack(side="left")
    145. root.mainloop()

    version 1.2:

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. import re
    4. import os
    5. import time
    6. import subprocess
    7. import tkinter as tk
    8. from tkinter import messagebox
    9. from PIL import Image, ImageTk
    10. # 设置ADB路径(根据你的系统和安装路径进行调整)
    11. ADB_PATH = 'C:/Users/DHY-20210315/AppData/Local/Android/Sdk/platform-tools/adb.exe'
    12. # 设置截屏图片显示比例
    13. scl = 0.7
    14. # 创建一个GUI窗口
    15. root = tk.Tk()
    16. root.title("ADB辅助点击助手")
    17. screen_width = root.winfo_screenwidth()
    18. screen_height = root.winfo_screenheight()
    19. # 设置窗口大小
    20. window_width = 900
    21. window_height = 600
    22. x = (screen_width - window_width) // 2
    23. y = (screen_height - window_height) // 2
    24. root.geometry(f"{window_width}x{window_height}+{x}+{y}")
    25. # 函数:通过ADB截屏并显示
    26. def capture_and_display():
    27. if r_var.get() == '':
    28. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    29. return
    30. # file = str(round(time.time() * 1000)) + '.png'
    31. file = 'screencap.png'
    32. scp = '/sdcard/Pictures/' + file
    33. capture_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'screencap', scp])
    34. capture_process.wait()
    35. lsc = './' + file
    36. pull_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'pull', scp, lsc])
    37. pull_process.wait()
    38. screenshot = Image.open(lsc)
    39. width, height = screenshot.size
    40. new_width = int(width * scl)
    41. new_height = int(height * scl)
    42. screenshot = screenshot.resize((new_width, new_height), Image.ANTIALIAS)
    43. s_w = new_width + 20
    44. s_h = new_height + 50
    45. root.geometry(f"{s_w}x{s_h}+{(screen_width - s_w) // 2}+{(screen_height - s_h) // 2}")
    46. img = ImageTk.PhotoImage(screenshot)
    47. img_label.config(image=img)
    48. img_label.image = img
    49. # 函数:通过ADB点击图片
    50. def click_img(event):
    51. if r_var.get() == '':
    52. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    53. return
    54. if ck_var.get() == 1:
    55. for i in range(8):
    56. subprocess.Popen(
    57. [ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    58. time.sleep(0.01)
    59. ck_var.set(0)
    60. else:
    61. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    62. time.sleep(1)
    63. capture_and_display()
    64. # 函数:通过ADB发送按键
    65. def send_back_command():
    66. if r_var.get() == '':
    67. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    68. return
    69. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'keyevent', '4'])
    70. time.sleep(1)
    71. capture_and_display()
    72. # 函数:通过ADB发送滑动
    73. def send_slide_command(arg):
    74. if r_var.get() == '':
    75. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    76. return
    77. if arg == 1:
    78. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 1000 969 800 100'])
    79. time.sleep(1)
    80. capture_and_display()
    81. else:
    82. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 800 969 1000 100'])
    83. time.sleep(1)
    84. capture_and_display()
    85. # 函数:通过ADB获取设备名
    86. def find_device():
    87. for widget in devices_frame.winfo_children():
    88. widget.destroy()
    89. dvs = os.popen("adb devices").readlines()
    90. dfs = ''
    91. for ss in dvs:
    92. ss = ss.strip('\n')
    93. if 'List of devices' not in ss and len(ss) > 6 and 'offline' not in ss:
    94. dv = ss.split('\t')[0]
    95. p = subprocess.Popen("adb -s %s shell getprop ro.product.model" % dv, stdout=subprocess.PIPE)
    96. result = p.communicate()
    97. dn = result[0].decode('utf-8').strip()
    98. cold_bev = tk.Radiobutton(devices_frame, text=dn, variable=r_var, value=dv)
    99. cold_bev.pack(side="left")
    100. if dfs == '':
    101. dfs = dv
    102. if dfs != '':
    103. r_var.set(dfs)
    104. else:
    105. r_var.set('')
    106. def find_ip(input_string):
    107. ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'
    108. ip_addresses = re.findall(ip_pattern, input_string)
    109. return ip_addresses[0]
    110. # 函数:通过ADB wifi连接设备
    111. def wifi_connect():
    112. if r_var.get() == '':
    113. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    114. return
    115. dv = r_var.get()
    116. if r_var.get().startswith('192.168.'):
    117. messagebox.showinfo(title='提示', message='已经是WiFi连接了啊!')
    118. return
    119. p = subprocess.Popen("adb -s %s shell ip -f inet addr show wlan0" % dv, stdout=subprocess.PIPE)
    120. result = p.communicate()
    121. dn = result[0].decode('utf-8').strip()
    122. ip = find_ip(dn)
    123. subprocess.Popen([ADB_PATH, 'connect', ip])
    124. button_frame = tk.Frame(root)
    125. button_frame.pack()
    126. capture_button = tk.Button(button_frame, text="刷新截屏", command=capture_and_display)
    127. capture_button.pack(side="left")
    128. tk.Label(button_frame, text=" ").pack(side="left")
    129. back_button = tk.Button(button_frame, text="后退", command=send_back_command)
    130. back_button.pack(side="left")
    131. tk.Label(button_frame, text=" ").pack(side="left")
    132. up_button = tk.Button(button_frame, text="上滑", command=lambda: send_slide_command(1))
    133. up_button.pack(side="left")
    134. tk.Label(button_frame, text=" ").pack(side="left")
    135. down_button = tk.Button(button_frame, text="下滑", command=lambda: send_slide_command(0))
    136. down_button.pack(side="left")
    137. tk.Label(button_frame, text=" ").pack(side="left")
    138. ck_var = tk.IntVar()
    139. c1 = tk.Checkbutton(button_frame, text='8连击', variable=ck_var, onvalue=1, offvalue=0)
    140. c1.pack(side="left")
    141. tk.Label(button_frame, text=" ").pack(side="left")
    142. r_var = tk.StringVar(value='')
    143. devices_frame = tk.Frame(button_frame)
    144. devices_frame.pack(side="left")
    145. find_device()
    146. img_label = tk.Label(root)
    147. img_label.pack()
    148. img_label.bind('', click_img)
    149. wifi_button = tk.Button(button_frame, text="WiFi连接", command=wifi_connect)
    150. wifi_button.pack(side="left")
    151. tk.Label(button_frame, text=" ").pack(side="left")
    152. wifi_button = tk.Button(button_frame, text="获取设备", command=find_device)
    153. wifi_button.pack(side="left")
    154. root.mainloop()

    version 1.3:

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. # version v1.3
    4. import re
    5. import os
    6. import time
    7. import subprocess
    8. import tkinter as tk
    9. from tkinter import messagebox
    10. from PIL import Image, ImageTk
    11. # 设置ADB路径(根据你的系统和安装路径进行调整)
    12. ADB_PATH = 'C:/Users/DHY-20210315/AppData/Local/Android/Sdk/platform-tools/adb.exe'
    13. # 设置截屏图片显示比例
    14. scl = 0.7
    15. # 创建一个GUI窗口
    16. root = tk.Tk()
    17. root.title("ADB辅助点击助手")
    18. screen_width = root.winfo_screenwidth()
    19. screen_height = root.winfo_screenheight()
    20. # 设置窗口大小
    21. window_width = 900
    22. window_height = 600
    23. x = (screen_width - window_width) // 2
    24. y = (screen_height - window_height) // 2
    25. root.geometry(f"{window_width}x{window_height}+{x}+{y}")
    26. # 函数:通过ADB截屏并显示
    27. def capture_and_display():
    28. if r_var.get() == '':
    29. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    30. return
    31. # file = str(round(time.time() * 1000)) + '.png'
    32. file = 'screencap.png'
    33. scp = '/sdcard/Pictures/' + file
    34. capture_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'screencap', scp])
    35. capture_process.wait()
    36. lsc = './' + file
    37. pull_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'pull', scp, lsc])
    38. pull_process.wait()
    39. screenshot = Image.open(lsc)
    40. width, height = screenshot.size
    41. new_width = int(width * scl)
    42. new_height = int(height * scl)
    43. screenshot = screenshot.resize((new_width, new_height), Image.ANTIALIAS)
    44. s_w = new_width + 20
    45. s_h = new_height + 50
    46. root.geometry(f"{s_w}x{s_h}+{(screen_width - s_w) // 2}+{(screen_height - s_h) // 2}")
    47. img = ImageTk.PhotoImage(screenshot)
    48. img_label.config(image=img)
    49. img_label.image = img
    50. # 函数:通过ADB点击图片
    51. def click_img(event):
    52. if r_var.get() == '':
    53. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    54. return
    55. if ck_var.get() == 1:
    56. for i in range(8):
    57. subprocess.Popen(
    58. [ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    59. time.sleep(0.2)
    60. ck_var.set(0)
    61. else:
    62. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])
    63. time.sleep(1)
    64. capture_and_display()
    65. # 函数:通过ADB发送按键
    66. def send_back_command():
    67. if r_var.get() == '':
    68. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    69. return
    70. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'keyevent', '4'])
    71. time.sleep(1)
    72. capture_and_display()
    73. # 函数:通过ADB发送滑动
    74. def send_slide_command(arg):
    75. if r_var.get() == '':
    76. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    77. return
    78. if arg == 1:
    79. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'touchscreen', 'swipe', '969 800 969 300 100'])
    80. time.sleep(1)
    81. capture_and_display()
    82. elif arg == 2:
    83. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'touchscreen', 'swipe', '1920 500 1620 500 1920 800 1620 800 100'])
    84. time.sleep(1)
    85. capture_and_display()
    86. elif arg == 3:
    87. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'keyevent', '26'])
    88. time.sleep(1)
    89. capture_and_display()
    90. elif arg == 4:
    91. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'reboot', '-p'])
    92. time.sleep(1)
    93. capture_and_display()
    94. elif arg == 5:
    95. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'touchscreen', 'swipe', '1300 500 300 500 100'])
    96. time.sleep(1)
    97. capture_and_display()
    98. elif arg == 6:
    99. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'touchscreen', 'swipe', '300 500 1300 500 100'])
    100. time.sleep(1)
    101. capture_and_display()
    102. else:
    103. subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'touchscreen', 'swipe', '969 300 969 800 100'])
    104. time.sleep(1)
    105. capture_and_display()
    106. # 函数:通过ADB获取设备名
    107. def find_device(aa=0):
    108. for widget in devices_frame.winfo_children():
    109. widget.destroy()
    110. dvs = os.popen("adb devices").readlines()
    111. dfs = ''
    112. for ss in dvs:
    113. ss = ss.strip('\n')
    114. if 'List of devices' not in ss and len(ss) > 6 and 'offline' not in ss:
    115. dv = ss.split('\t')[0]
    116. p = subprocess.Popen("adb -s %s shell getprop ro.product.model" % dv, stdout=subprocess.PIPE)
    117. result = p.communicate()
    118. dn = result[0].decode('utf-8').strip()
    119. cold_bev = tk.Radiobutton(devices_frame, text=dn, variable=r_var, value=dv)
    120. cold_bev.pack(side="left")
    121. if dfs == '':
    122. dfs = dv
    123. if dfs != '':
    124. r_var.set(dfs)
    125. else:
    126. r_var.set('')
    127. if aa == 0:
    128. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    129. def find_ip(input_string):
    130. ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'
    131. ip_addresses = re.findall(ip_pattern, input_string)
    132. return ip_addresses[0]
    133. # 函数:通过ADB wifi连接设备
    134. def wifi_connect():
    135. if r_var.get() == '':
    136. messagebox.showinfo(title='提示', message='没有连接设备呀!')
    137. return
    138. dv = r_var.get()
    139. if r_var.get().startswith('192.168.'):
    140. messagebox.showinfo(title='提示', message='已经是WiFi连接了啊!')
    141. return
    142. p = subprocess.Popen("adb -s %s shell ip -f inet addr show wlan0" % dv, stdout=subprocess.PIPE)
    143. result = p.communicate()
    144. dn = result[0].decode('utf-8').strip()
    145. ip = find_ip(dn)
    146. subprocess.Popen([ADB_PATH, 'connect', ip])
    147. button_frame = tk.Frame(root)
    148. button_frame.pack()
    149. capture_button = tk.Button(button_frame, text="刷新截屏", command=capture_and_display)
    150. capture_button.pack(side="left")
    151. tk.Label(button_frame, text=" ").pack(side="left")
    152. back_button = tk.Button(button_frame, text="后退", command=send_back_command)
    153. back_button.pack(side="left")
    154. tk.Label(button_frame, text=" ").pack(side="left")
    155. up_button = tk.Button(button_frame, text="上滑", command=lambda: send_slide_command(1))
    156. up_button.pack(side="left")
    157. tk.Label(button_frame, text=" ").pack(side="left")
    158. down_button = tk.Button(button_frame, text="下滑", command=lambda: send_slide_command(0))
    159. down_button.pack(side="left")
    160. tk.Label(button_frame, text=" ").pack(side="left")
    161. up_button = tk.Button(button_frame, text="左滑", command=lambda: send_slide_command(5))
    162. up_button.pack(side="left")
    163. tk.Label(button_frame, text=" ").pack(side="left")
    164. down_button = tk.Button(button_frame, text="右滑", command=lambda: send_slide_command(6))
    165. down_button.pack(side="left")
    166. tk.Label(button_frame, text=" ").pack(side="left")
    167. #down_button = tk.Button(button_frame, text="分屏", command=lambda: send_slide_command(2))
    168. #down_button.pack(side="left")
    169. #tk.Label(button_frame, text=" ").pack(side="left")
    170. down_button = tk.Button(button_frame, text="点亮", command=lambda: send_slide_command(3))
    171. down_button.pack(side="left")
    172. tk.Label(button_frame, text=" ").pack(side="left")
    173. down_button = tk.Button(button_frame, text="关机", command=lambda: send_slide_command(4))
    174. down_button.pack(side="left")
    175. tk.Label(button_frame, text=" ").pack(side="left")
    176. ck_var = tk.IntVar()
    177. c1 = tk.Checkbutton(button_frame, text='8连击', variable=ck_var, onvalue=1, offvalue=0)
    178. c1.pack(side="left")
    179. tk.Label(button_frame, text=" ").pack(side="left")
    180. r_var = tk.StringVar(value='')
    181. devices_frame = tk.Frame(button_frame)
    182. devices_frame.pack(side="left")
    183. find_device(1)
    184. img_label = tk.Label(root)
    185. img_label.pack()
    186. img_label.bind('', click_img)
    187. wifi_button = tk.Button(button_frame, text="WiFi连接", command=wifi_connect)
    188. wifi_button.pack(side="left")
    189. tk.Label(button_frame, text=" ").pack(side="left")
    190. wifi_button = tk.Button(button_frame, text="获取设备", command=find_device)
    191. wifi_button.pack(side="left")
    192. tk.Label(button_frame, text=" ").pack(side="left")
    193. root.mainloop()

  • 相关阅读:
    【尚硅谷】第05章:随堂复习与企业真题(数组)
    【AGC】云测试服务页面报错问题
    一、Java 基础
    springboot+电影售票小程序 毕业设计-附源码201532
    C#Regex正则表达式(Regular Expression)
    Python-Sqlalchemy(ORM数据库框架)
    Leetcode49 字母异位词分组解析
    二分套网络流:ABC320G
    证照之星XE7下载安装详细教程
    Springboot-案例 增删改查二
  • 原文地址:https://blog.csdn.net/qq1053781225/article/details/132763435