import tkinter as tk # 導入TKinter
import pyautogui # 導入判斷滑鼠位置
import time # 導入時間
import cv2 # 導入照片處理
import numpy as np # 導入照片處理
import pyscreenshot as ImageGrab # 導入螢幕截圖
x,y = pyautogui.position() # 這個函式用來判斷滑鼠目前位置
W = tk.Tk() # 建立主視窗 Frame
W.title('Monkey') # 設定視窗標題
window_width = W.winfo_screenwidth() # 取得電腦螢幕寬度
window_height = W.winfo_screenheight() # 取得電腦螢幕高度
width = 300 # 視窗大小
height = 300 # 視窗大小
left = int((window_width - width)/2) # 計算左上 x 座標
top = int((window_height - height)/2) # 計算左上 y 座標
W.geometry(f'{width}x{height}+{left}+{top}') # 視窗置中
W.iconbitmap('monkey.ico') # 檔案圖.ico
W.resizable(False, False ) # 設定 x 方向和 y 方向都不能縮放
def run():
if var1.get() == 1:
run2()
def run2():
im = ImageGrab.grab(
bbox=(2105,1054,2204,1148)) # 擷取指定範圍畫面(x1,y1,x2,y2)
im.save("b.png") # 儲存檔案
image1 = cv2.imread("a.png") # 圖片1
image2 = cv2.imread("b.png") # 圖片2
diff = cv2.subtract(image1,image2) # 判斷兩張圖
result = not np.any(diff)
if result is True:
print("Yes")
else:
cv2.imwrite("b.png",diff)
print("NO")
var1=tk.BooleanVar() # 綁定第 1 個選項的類別變數
var1.set(0) # 預設不選取
tk.Checkbutton(W, text="執行",variable=var1,command=run).pack(pady=100)
a=var1.get()
while a==1:
run()
END = tk.Button(W,text='結束', command=W.destroy) # 按結束按鈕結束程式
END.pack(side=tk.LEFT,padx=120,pady=0)
W.mainloop() # 執行主程式
大家好~我是自學的新手
剛寫一個判斷圖片執行動作的程式
但是每次打勾卻只執行一次,無法在打勾的情況下持續執行直到打勾結束
請問各位大大,我是哪邊有寫錯呢? 感謝各位
補充功能:
1.當打勾執行選項時執行以下功能
2.進行螢幕截圖,判斷截圖與自行準備的圖是否一致
3.一致則印出YES反之印出NO
你的程式碼有一個無窮迴圈,會一直執行直到程式強制結束。程式碼執行到 while a==1: 的時候,會進入無窮迴圈,因為變數 a 的值已經在 var1.get() 設定為 False,但這個變數的值在無窮迴圈中沒有機會改變。建議你修改成下面的程式碼,將無窮迴圈刪除,改成按下按鈕後執行一次 run2() 函數:
def run():
if var1.get() == 1:
run2()
def run2():
im = ImageGrab.grab(bbox=(2105,1054,2204,1148)) # 擷取指定範圍畫面(x1,y1,x2,y2)
im.save("b.png") # 儲存檔案
image1 = cv2.imread("a.png") # 圖片1
image2 = cv2.imread("b.png") # 圖片2
diff = cv2.subtract(image1, image2) # 判斷兩張圖
result = not np.any(diff)
if result is True:
print("Yes")
else:
cv2.imwrite("b.png", diff)
print("NO")
W = tk.Tk() # 建立主視窗 Frame
# 其他 GUI 界面設定
# ...
tk.Checkbutton(W, text="執行", variable=var1, command=run).pack(pady=100)
END = tk.Button(W, text='結束', command=W.destroy) # 按結束按鈕結束程式
END.pack(side=tk.LEFT, padx=120, pady=0)
W.mainloop() # 執行主程式
在上面的修改版本中,run() 函數會在使用者按下「執行」的按鈕時被呼叫,如果 checkbox 被打勾了,就會執行一次 run2() 函數,並且 run2() 函數會在執行完後結束。