import io
import time
import socket
import pyautogui
def capture_and_send_image():
while True:
try:
# 截图
screenshot = pyautogui.screenshot()
# 缩小图片
new_size = (screenshot.width // 10, screenshot.height // 10)
resized_screenshot = screenshot.resize(new_size)
# 将图片转换为字节流
img_byte_arr = io.BytesIO()
resized_screenshot.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# 发送数据
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 10000))
s.sendall(img_byte_arr)
s.close()
except Exception as e:
print(f"发送端发生错误: {e}")
# 暂停一段时间,避免过于频繁发送
time.sleep(0.2)
if __name__ == "__main__":
while True:
try:
capture_and_send_image()
except Exception as e:
print(e)
time.sleep(1)
print("重新连接")
import time
import socket
import threading
import tkinter as tk
from tkinter import PhotoImage
start_time = None
network_flux = 0
one_second_data = 0
fps_times = 0
fps = 0
def network(KB):
global start_time, network_flux, one_second_data, fps_times, fps
network_flux += KB
if start_time is None:
start_time = time.time()
return
if time.time() - start_time > 2: # 两秒更新一次
one_second_data = f"{network_flux / 1024 / (time.time() - start_time):.1f} kb/s"
fps = f"{fps_times / (time.time() - start_time):.1f} fps/s"
print(one_second_data)
network_flux = KB
start_time = None
fps_times = 0
class DraggableImage:
def __init__(self):
self.root = tk.Tk()
self.root.title("Image")
self.bg_color = '#F0F0F0' # 透明
self.root.config(bg=self.bg_color) # 背景色
self.root.wm_attributes('-transparentcolor', self.bg_color) # 透明
self.root.wm_attributes("-topmost", True) # 无边框
self.root.overrideredirect(True) # 置顶
self.drag_data = {"x": 0, "y": 0, "is_dragging": False}
self.tk_image = None
self.canvas = tk.Canvas(self.root)
self.canvas.pack()
self.time_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
self.time_label.pack(side=tk.TOP)
self.fps_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
self.fps_label.pack(side=tk.TOP)
self.start_receive_image()
def start_receive_image(self):
thread = threading.Thread(target=self.receive_image)
thread.start()
def receive_image(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 10000))
s.listen(1)
while True:
try:
conn, addr = s.accept()
img_data = b""
while True:
data = conn.recv(1024)
if not data:
break
img_data += data
conn.close()
network(len(img_data))
# 加锁确保 UI 更新线程安全
self.root.after(0, self.update_image, img_data)
except Exception as e:
print(f"接收端发生错误: {e}")
def update_image(self, img_data):
global fps_times
fps_times += 1
# 释放之前的图像资源
if self.tk_image:
del self.tk_image
# 获取尺寸
original_width, original_height = 160, 90
# 控制图片数据用于反复使用覆盖,而不是新增
self.tk_image = PhotoImage(data=img_data)
# 仅更新图像,而不是销毁并重建 canvas
self.canvas.config(width=original_width, height=original_height)
self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)
self.canvas.bind("", self.on_press)
self.canvas.bind("", self.on_drag)
self.canvas.bind("", self.on_release)
self.canvas.bind("", self.on_right_click)
# 更新时间和 fps 信息
self.update_time_and_fps()
def update_time_and_fps(self):
global one_second_data, fps
self.time_label.config(text=one_second_data)
self.fps_label.config(text=fps)
self.root.after(2000, self.update_time_and_fps)
# 右键点击销毁
def on_right_click(self, event):
self.canvas.destroy()
self.root.destroy()
raise 0
def on_press(self, event):
# 记录鼠标按下时的位置
self.drag_data["x"] = event.x_root
self.drag_data["y"] = event.y_root
self.drag_data["is_dragging"] = True
def on_drag(self, event):
if self.drag_data["is_dragging"]:
# 计算鼠标移动的偏移量
dx = event.x_root - self.drag_data["x"]
dy = event.y_root - self.drag_data["y"]
# 移动窗口
self.root.geometry(f"+{self.root.winfo_x() + dx}+{self.root.winfo_y() + dy}")
# 更新鼠标位置
self.drag_data["x"] = event.x_root
self.drag_data["y"] = event.y_root
def on_release(self, event):
# 释放时清除拖动状态
self.drag_data["is_dragging"] = False
if __name__ == "__main__":
app = DraggableImage()
app.root.mainloop()
import io
import time
import socket
import pyautogui
def capture_and_send_image():
while True:
try:
# 截图
screenshot = pyautogui.screenshot()
# 缩小图片
new_size = (screenshot.width // 10, screenshot.height // 10)
resized_screenshot = screenshot.resize(new_size)
# 将图片转换为字节流
img_byte_arr = io.BytesIO()
resized_screenshot.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# 发送数据
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 10000))
s.sendall(img_byte_arr)
s.close()
except Exception as e:
print(f"发送端发生错误: {e}")
# 暂停一段时间,避免过于频繁发送
time.sleep(0.2)
if __name__ == "__main__":
while True:
try:
capture_and_send_image()
except Exception as e:
print(e)
time.sleep(1)
print("重新连接")
import time
import socket
import threading
import tkinter as tk
from tkinter import PhotoImage
start_time = None
network_flux = 0
one_second_data = 0
fps_times = 0
fps = 0
def network(KB):
global start_time, network_flux, one_second_data, fps_times, fps
network_flux += KB
if start_time is None:
start_time = time.time()
return
if time.time() - start_time > 2: # 两秒更新一次
one_second_data = f"{network_flux / 1024 / (time.time() - start_time):.1f} kb/s"
fps = f"{fps_times / (time.time() - start_time):.1f} fps/s"
print(one_second_data)
network_flux = KB
start_time = None
fps_times = 0
class DraggableImage:
def __init__(self):
self.root = tk.Tk()
self.root.title("Image")
self.bg_color = '#F0F0F0' # 透明
self.root.config(bg=self.bg_color) # 背景色
self.root.wm_attributes('-transparentcolor', self.bg_color) # 透明
self.root.wm_attributes("-topmost", True) # 无边框
self.root.overrideredirect(True) # 置顶
self.drag_data = {"x": 0, "y": 0, "is_dragging": False}
self.tk_image = None
self.canvas = tk.Canvas(self.root)
self.canvas.pack()
self.time_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
self.time_label.pack(side=tk.TOP)
self.fps_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
self.fps_label.pack(side=tk.TOP)
self.start_receive_image()
def start_receive_image(self):
thread = threading.Thread(target=self.receive_image)
thread.start()
def receive_image(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 10000))
s.listen(1)
while True:
try:
conn, addr = s.accept()
img_data = b""
while True:
data = conn.recv(1024)
if not data:
break
img_data += data
conn.close()
network(len(img_data))
# 加锁确保 UI 更新线程安全
self.root.after(0, self.update_image, img_data)
except Exception as e:
print(f"接收端发生错误: {e}")
def update_image(self, img_data):
global fps_times
fps_times += 1
# 释放之前的图像资源
if self.tk_image:
del self.tk_image
# 获取尺寸
original_width, original_height = 160, 90
# 控制图片数据用于反复使用覆盖,而不是新增
self.tk_image = PhotoImage(data=img_data)
# 仅更新图像,而不是销毁并重建 canvas
self.canvas.config(width=original_width, height=original_height)
self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)
self.canvas.bind("", self.on_press)
self.canvas.bind("", self.on_drag)
self.canvas.bind("", self.on_release)
self.canvas.bind("", self.on_right_click)
# 更新时间和 fps 信息
self.update_time_and_fps()
def update_time_and_fps(self):
global one_second_data, fps
self.time_label.config(text=one_second_data)
self.fps_label.config(text=fps)
self.root.after(2000, self.update_time_and_fps)
# 右键点击销毁
def on_right_click(self, event):
self.canvas.destroy()
self.root.destroy()
raise 0
def on_press(self, event):
# 记录鼠标按下时的位置
self.drag_data["x"] = event.x_root
self.drag_data["y"] = event.y_root
self.drag_data["is_dragging"] = True
def on_drag(self, event):
if self.drag_data["is_dragging"]:
# 计算鼠标移动的偏移量
dx = event.x_root - self.drag_data["x"]
dy = event.y_root - self.drag_data["y"]
# 移动窗口
self.root.geometry(f"+{self.root.winfo_x() + dx}+{self.root.winfo_y() + dy}")
# 更新鼠标位置
self.drag_data["x"] = event.x_root
self.drag_data["y"] = event.y_root
def on_release(self, event):
# 释放时清除拖动状态
self.drag_data["is_dragging"] = False
if __name__ == "__main__":
app = DraggableImage()
app.root.mainloop()