1131104-遠端開機
使用繁體中文,在w11下使用pytho語言,使用UI界面,預設UI800*600,畫面如圖片方式,在區域網路中,希望可以掃描這個區網中的設備,並能發生遠端開機功能給遠電腦,要如何設計程式?
linux
sudo apt-get install gwakeonlan
shutdown /s /f /t 0 →關機
shutdown /r /f /t 0 →重啟
禁用休眠模式
powercfg /hibernate off
生成電池報告
powercfg /batteryreport /output "C:\battery_report.html"
https://www.nirsoft.net/utils/wake_on_lan.html
1131104-wakeonlan-test02-01
import tkinter as tk
from tkinter import ttk
import subprocess
import threading
import re
import socket
from wakeonlan import send_magic_packet
import ipaddress
import platform
import logging
# 設定日誌
logging.basicConfig(level=logging.INFO)
# 初始化 UI 和設定
root = tk.Tk()
root.title("區域網路掃描與遠端開機工具")
root.geometry("800x600")
# 更新 Treeview 欄位,添加「電腦名稱」
tree = ttk.Treeview(root, columns=("IP Address", "MAC Address", "Computer Name", "Status"), show="headings")
tree.heading("IP Address", text="IP 位址")
tree.heading("MAC Address", text="MAC 位址")
tree.heading("Computer Name", text="電腦名稱") # 新增的欄位
tree.heading("Status", text="狀態")
tree.pack(fill=tk.BOTH, expand=True)
# 儲存掃描結果的列表
scan_results = []
# 上鎖機制確保執行緒安全
lock = threading.Lock()
def get_computer_name(ip):
# 嘗試通過 nslookup 獲取電腦名稱
try:
result = subprocess.run(["nslookup", ip], capture_output=True, text=True)
for line in result.stdout.splitlines():
if "name =" in line:
return line.split("=")[-1].strip()
except Exception as e:
logging.error(f"獲取電腦名稱時發生錯誤: {e}")
return "N/A"
def arp_scan():
# 執行 ARP 命令來獲取局域網中的設備
output = subprocess.run(["arp", "-a"], capture_output=True, text=True)
for line in output.stdout.splitlines():
# 使用正則表達式來匹配 IP 和 MAC 地址
ip_match = re.search(r"\d+\.\d+\.\d+\.\d+", line)
mac_match = re.search(r"([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})", line)
if ip_match and mac_match:
ip = ip_match.group(0)
mac = mac_match.group(0)
computer_name = get_computer_name(ip) # 獲取電腦名稱
status = "On" # 假設在 ARP 表中找到的設備處於開啟狀態
with lock:
scan_results.append((ip, mac, computer_name, status))
def port_scan(ip, port=80):
# 嘗試連接到指定 IP 的特定端口,以檢查是否存在
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.settimeout(0.5) # 設置超時時間
if sock.connect_ex((ip, port)) == 0:
return True
except Exception:
pass
return False
def threaded_port_scan(ip):
# 執行執行緒中的端口掃描並更新結果
if port_scan(ip, port=80):
mac_address = "N/A" # 如果無法通過 ARP 獲取 MAC,可以留空或設為 N/A
computer_name = get_computer_name(ip) # 獲取電腦名稱
status = "On"
with lock:
scan_results.append((ip, mac_address, computer_name, status))
update_tree()
def scan_network():
tree.delete(*tree.get_children()) # 清空 Treeview 資料
scan_results.clear() # 清除之前的掃描結果
# 執行 ARP 掃描
arp_scan()
update_tree() # 顯示 ARP 掃描結果
# 端口掃描:為每個 IP 啟動執行緒來掃描
net_prefix = "192.168.1."
threads = []
for i in range(1, 255):
ip = f"{net_prefix}{i}"
t = threading.Thread(target=threaded_port_scan, args=(ip,))
threads.append(t)
t.start()
# 等待所有執行緒完成
for t in threads:
t.join()
# 最終更新排序後的結果
sorted_results = sorted(scan_results, key=lambda x: ipaddress.IPv4Address(x[0]))
update_tree(sorted_results)
#def update_tree(data=None):
"""將結果顯示到 Treeview 中"""
#if data is None:
# data = scan_results
#else:
# data = sorted(data, key=lambda x: ipaddress.IPv4Address(x[0]))
# 清空現有顯示
#tree.delete(*tree.get_children())
#for ip, mac_address, computer_name, status in data:
# tree.insert("", tk.END, values=(ip, mac_address, computer_name, status))
def update_tree(data=None):
"""將結果顯示到 Treeview 中"""
if data is None:
data = scan_results
else:
data = sorted(data, key=lambda x: ipaddress.IPv4Address(x[0]))
# 使用 after 在主線程中更新
root.after(0, lambda: tree.delete(*tree.get_children()))
for ip, mac_address, computer_name, status in data:
root.after(0, lambda ip=ip, mac_address=mac_address, computer_name=computer_name, status=status:
tree.insert("", tk.END, values=(ip, mac_address, computer_name, status)))
# 使用 ThreadPoolExecutor 進行多執行緒掃描
from concurrent.futures import ThreadPoolExecutor
def scan_network():
tree.delete(*tree.get_children())
scan_results.clear()
arp_scan()
update_tree()
net_prefix = "192.168.1."
with ThreadPoolExecutor(max_workers=20) as executor: # 設定最大工作執行緒數
for i in range(1, 255):
ip = f"{net_prefix}{i}"
executor.submit(threaded_port_scan, ip)
# 確保最終結果更新
update_tree(sorted(scan_results, key=lambda x: ipaddress.IPv4Address(x[0])))
# 發送遠端開機封包
def wake_on_lan():
selected_item = tree.selection()
if selected_item:
mac_address = tree.item(selected_item)["values"][1] # 確保正確取用 MAC 位址
if mac_address != "N/A":
send_magic_packet(mac_address)
else:
logging.warning("選取的電腦沒有有效的 MAC 位址。")
# 按鈕:執行掃描
scan_button = tk.Button(root, text="掃描區網", command=lambda: threading.Thread(target=scan_network).start())
scan_button.pack(side=tk.LEFT, padx=10, pady=10)
# 遠端開機按鈕
wake_button = tk.Button(root, text="遠端開機", command=wake_on_lan)
wake_button.pack(side=tk.LEFT, padx=10, pady=10)
root.mainloop()
1131104-wakeonlan-test01
import tkinter as tk
from tkinter import ttk
import socket
from wakeonlan import send_magic_packet
import threading
# UI設置
root = tk.Tk()
root.title("區域網路掃描與遠端開機工具")
root.geometry("800x600")
# 創建Treeview
tree = ttk.Treeview(root, columns=("IP Address", "Computer Name", "MAC Address", "Status"), show="headings")
tree.heading("IP Address", text="IP 位址")
tree.heading("Computer Name", text="計算機名稱")
tree.heading("MAC Address", text="MAC 位址")
tree.heading("Status", text="狀態")
tree.pack(fill=tk.BOTH, expand=True)
# 掃描區域網路中的設備
def scan_network():
tree.delete(*tree.get_children()) # 清除列表
# 假設本機IP為 192.168.0.X
for i in range(1, 255):
ip = f"192.168.0.{i}"
threading.Thread(target=ping_device, args=(ip,)).start()
def ping_device(ip):
try:
socket.setdefaulttimeout(1)
result = socket.gethostbyaddr(ip)
mac_address = get_mac_address(ip) # 需定義函數來獲取MAC位址
tree.insert("", tk.END, values=(ip, result[0], mac_address, "On"))
except:
pass
# 發送遠端開機封包
def wake_on_lan():
selected_item = tree.selection()
if selected_item:
mac_address = tree.item(selected_item)["values"][2]
send_magic_packet(mac_address)
# 掃描按鈕
scan_button = tk.Button(root, text="掃描區網", command=scan_network)
scan_button.pack(side=tk.LEFT, padx=10, pady=10)
# 遠端開機按鈕
wake_button = tk.Button(root, text="遠端開機", command=wake_on_lan)
wake_button.pack(side=tk.LEFT, padx=10, pady=10)
root.mainloop()
使用繁體中文,在w11下使用pytho語言,使用UI界面,在區域網路中,伺服端電腦啟動後發送廣播,clinet端電腦啟後向伺服端電腦報到,並回報clinet端電腦的IP位置、MAC位置、電腦名稱,使用8500port溝通,伺服端
查現在使用的port的狀況
netstat -ano | findstr :8500
使用繁體中文,在W11下,使用python語言,使用UI界面,要設計一個按鈕,功能是按下後,讓本機電腦重新啟動,要如何處理,請給完整範例,謝謝
import tkinter as tk
import os
def restart_computer():
# 使用 os 模塊重啟電腦
os.system("shutdown /r /t 0")
# 創建主窗口
root = tk.Tk()
root.title("重新啟動電腦-製作者:WCS-2024.10.06")
root.geometry("300x150") # 設定窗口大小
# 創建按鈕,點擊後呼叫 restart_computer 函數
restart_button = tk.Button(root, text="重新啟動", command=restart_computer, font=("Arial", 16))
restart_button.pack(pady=20) # 在窗口中添加按鈕並設定邊距
# 運行主循環
root.mainloop()
使用繁體中文,在W11下,使用python語言,使用UI界面,要設計一個按鈕,功能是按下後,讓區網中遠端電腦重新啟動,要如何處理,請給完整範例,謝謝
import tkinter as tk
import os
def restart_remote_computer():
"""重新啟動遠端電腦的函數"""
ip_address = entry_ip.get() # 獲取用戶輸入的 IP 地址
command = f"shutdown /r /t 0 /m \\\\{ip_address}"
os.system(command)
# 創建主窗口
root = tk.Tk()
root.title("遠端電腦管理工具")
root.geometry("400x200") # 設定窗口大小
# 創建 IP 地址輸入框
label_ip = tk.Label(root, text="請輸入遠端電腦的 IP 地址:", font=("Arial", 12))
label_ip.pack(pady=10)
entry_ip = tk.Entry(root, font=("Arial", 12))
entry_ip.pack(pady=5)
# 創建重新啟動按鈕
restart_button = tk.Button(root, text="重新啟動遠端電腦", command=restart_remote_computer, font=("Arial", 16))
restart_button.pack(pady=20)
# 運行主循環
root.mainloop()
使用繁體中文,在W11下,使用python語言,使用UI界面,要設計一個按鈕,功能是按下後,讓區網中遠端電腦開機啟動,要如何處理,請給完整範例,謝謝
pip install wakeonlan
import tkinter as tk
from wakeonlan import send_magic_packet
def wake_remote_computer():
"""喚醒遠端電腦的函數"""
mac_address = entry_mac.get() # 獲取用戶輸入的 MAC 地址
try:
send_magic_packet(mac_address)
label_status.config(text="已發送喚醒信號!", fg="green")
except Exception as e:
label_status.config(text=f"發送失敗:{e}", fg="red")
# 創建主窗口
root = tk.Tk()
root.title("遠端電腦開機工具")
root.geometry("400x200") # 設定窗口大小
# 創建 MAC 地址輸入框
label_mac = tk.Label(root, text="請輸入遠端電腦的 MAC 地址:", font=("Arial", 12))
label_mac.pack(pady=10)
entry_mac = tk.Entry(root, font=("Arial", 12))
entry_mac.pack(pady=5)
# 創建喚醒按鈕
wake_button = tk.Button(root, text="喚醒遠端電腦", command=wake_remote_computer, font=("Arial", 16))
wake_button.pack(pady=20)
# 狀態標籤
label_status = tk.Label(root, text="", font=("Arial", 12))
label_status.pack(pady=10)
# 運行主循環
root.mainloop()
如果你希望使用 wakeonlan 庫進行跨網段喚醒,需要確保已正確配置上述其中一種方法。這樣,你就可以在跨網段的情況下使用 Python 程式碼發送 WoL 魔術包:
send_magic_packet(mac_address, ip_address="遠端電腦的IP", port=9)
使用繁體中文,在W11下,使用python語言,使用UI界面,要能呈現系統本機已安裝的印表機列表呈現,要設計一個功能按鈕,讓使用者可以選定已安裝的印表機,設為預設的印表機
pip install pywin32
import tkinter as tk
from tkinter import ttk
import win32print
def get_printer_list():
"""獲取系統已安裝的印表機列表"""
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
return [printer[2] for printer in printers]
def set_default_printer(printer_name):
"""設置選定的印表機為預設印表機"""
win32print.SetDefaultPrinter(printer_name)
status_label.config(text=f"已將 '{printer_name}' 設為預設印表機。")
# 建立主窗口
root = tk.Tk()
root.title("印表機管理")
# 獲取印表機列表
printers = get_printer_list()
# 創建下拉選單
printer_var = tk.StringVar(value=printers[0])
printer_combobox = ttk.Combobox(root, textvariable=printer_var, values=printers)
printer_combobox.pack(pady=10)
# 創建按鈕
set_default_button = tk.Button(root, text="設為預設印表機", command=lambda: set_default_printer(printer_var.get()))
set_default_button.pack(pady=10)
# 狀態標籤
status_label = tk.Label(root, text="")
status_label.pack(pady=10)
# 啟動主循環
root.mainloop()
-預設大小300*200
import tkinter as tk
from tkinter import messagebox, ttk
import win32print
def get_printers():
"""獲取已安裝的印表機列表"""
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
return [printer[2] for printer in printers]
def set_default_printer(printer_name):
"""設置預設印表機"""
try:
win32print.SetDefaultPrinter(printer_name)
messagebox.showinfo("成功", f"{printer_name} 已設為預設印表機")
except Exception as e:
messagebox.showerror("錯誤", f"無法設置預設印表機: {str(e)}")
def on_set_default():
"""當按鈕被點擊時的處理函數"""
selected_printer = printer_combobox.get()
if selected_printer:
set_default_printer(selected_printer)
else:
messagebox.showwarning("警告", "請選擇一個印表機")
# 建立主窗口
root = tk.Tk()
root.title("印表機管理器")
root.geometry("300x200") # 設定窗口大小為 300x200
# 獲取印表機列表
printers = get_printers()
# 創建下拉選單
printer_combobox = ttk.Combobox(root, values=printers)
printer_combobox.set("選擇印表機")
printer_combobox.pack(pady=20)
# 創建按鈕
set_default_button = tk.Button(root, text="設為預設印表機", command=on_set_default)
set_default_button.pack(pady=10)
# 啟動主循環
root.mainloop()
-加上目前預設的印表機是
import tkinter as tk
from tkinter import messagebox, ttk
import win32print
def get_printers():
"""獲取已安裝的印表機列表"""
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
return [printer[2] for printer in printers]
def set_default_printer(printer_name):
"""設置預設印表機"""
try:
win32print.SetDefaultPrinter(printer_name)
update_default_printer_label() # 更新標籤顯示
messagebox.showinfo("成功", f"{printer_name} 已設為預設印表機")
except Exception as e:
messagebox.showerror("錯誤", f"無法設置預設印表機: {str(e)}")
def update_default_printer_label():
"""更新顯示當前預設印表機的標籤"""
default_printer = win32print.GetDefaultPrinter()
default_printer_label.config(text=f"當前預設印表機: {default_printer}")
def on_set_default():
"""當按鈕被點擊時的處理函數"""
selected_printer = printer_combobox.get()
if selected_printer:
set_default_printer(selected_printer)
else:
messagebox.showwarning("警告", "請選擇一個印表機")
# 建立主窗口
root = tk.Tk()
root.title("印表機管理器")
root.geometry("300x200") # 設定窗口大小為 300x200
# 獲取印表機列表
printers = get_printers()
# 創建下拉選單
printer_combobox = ttk.Combobox(root, values=printers)
printer_combobox.set("選擇印表機")
printer_combobox.pack(pady=20)
# 創建顯示當前預設印表機的標籤
default_printer_label = tk.Label(root, text="")
default_printer_label.pack(pady=5)
update_default_printer_label() # 初始化顯示當前預設印表機
# 創建按鈕
set_default_button = tk.Button(root, text="設為預設印表機", command=on_set_default)
set_default_button.pack(pady=10)
# 啟動主循環
root.mainloop()
班級及科任卬表機管理工具
import tkinter as tk
from tkinter import messagebox, ttk
import win32print
def get_printers():
"""獲取已安裝的印表機列表"""
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
return [printer[2] for printer in printers]
def set_default_printer(printer_name):
"""設置預設印表機"""
try:
win32print.SetDefaultPrinter(printer_name)
update_default_printer_label() # 更新標籤顯示
messagebox.showinfo("成功", f"{printer_name} 已設為預設印表機")
except Exception as e:
messagebox.showerror("錯誤", f"無法設置預設印表機: {str(e)}")
def update_default_printer_label():
"""更新顯示當前預設印表機的標籤"""
default_printer = win32print.GetDefaultPrinter()
default_printer_label.config(text=f"當前預設印表機: {default_printer}")
def on_set_default():
"""當按鈕被點擊時的處理函數"""
selected_printer = printer_combobox.get()
if selected_printer and selected_printer != "選擇印表機":
set_default_printer(selected_printer)
else:
messagebox.showwarning("警告", "請先選擇印表機")
# 建立主窗口
root = tk.Tk()
root.title("班級及科任印表機管理工具 by WCS 2024.10.07")
root.geometry("650x300") # 設定窗口大小為 650x300
# 獲取印表機列表
printers = get_printers()
# 創建下拉選單
printer_combobox = ttk.Combobox(root, values=printers)
printer_combobox.set("選擇印表機")
# 設定字體屬性
printer_combobox['justify'] = 'center' # 文字置中
printer_combobox.configure(font=('Arial', 18)) # 字型和大小
# 改變 Combobox 的樣式
style = ttk.Style()
style.configure("TCombobox", foreground="red") # 字體顏色設為紅色
printer_combobox.pack(pady=30, fill=tk.X) # 設置為填滿窗口寬度)
# 創建顯示當前預設印表機的標籤
default_printer_label = tk.Label(root, text="", font=("Arial", 18), fg="blue")
default_printer_label.pack(pady=5)
update_default_printer_label() # 初始化顯示當前預設印表機
# 創建按鈕
set_default_button = tk.Button(root, text="設為預設印表機", command=on_set_default, font=("Arial", 18), fg="orange")
set_default_button.pack(pady=10)
# 啟動主循環
root.mainloop()
螢幕同步
使用繁體中文,在w11下,使用python語言,UI界面,要設計一個使用者螢幕輸出手動切換的方式,希望有鏡向輸出及目前螢幕畫面,能給可執行的範例嗎?
pip install Pillow
pip install numpy
import tkinter as tk
import os
# Function to switch displays using DisplaySwitch.exe
def switch_display(option):
commands = {
"PC screen only": "DisplaySwitch.exe /internal",
"Duplicate": "DisplaySwitch.exe /clone",
"Extend": "DisplaySwitch.exe /extend",
"Second screen only": "DisplaySwitch.exe /external"
}
if option in commands:
os.system(commands[option])
# Initialize the main window
window = tk.Tk()
window.title("螢幕切換方式 by WCS 2024.10.07")
# Set window size
window.geometry("400x300")
# Create and configure a frame
frame = tk.Frame(window, padx=20, pady=20)
frame.pack()
# Create buttons for each display mode
options = ["僅電腦螢幕", "同步顯示", "延伸", "僅第二個螢幕"]
for option in options:
display_option = {
"僅電腦螢幕": "PC screen only",
"同步顯示": "Duplicate",
"延伸": "Extend",
"僅第二個螢幕": "Second screen only"
}[option]
button = tk.Button(frame, text=option, width=20, command=lambda o=display_option: switch_display(o),fg="blue", font=("Arial", 16))# 設定文字顏色及字體大小
button.pack(pady=5)
# Run the Tkinter event loop
window.mainloop()