iT邦幫忙

0

While只會執行一次

  • 分享至 

  • xImage
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

看更多先前的討論...收起先前的討論...
啥意思功能要幹嘛 沒有說清楚
habi_tw iT邦新手 5 級 ‧ 2023-02-03 21:43:53 檢舉
不好意思,已經補上功能,再麻煩各位大大幫我解惑,感謝
增廣建文 iT邦研究生 5 級 ‧ 2023-02-03 23:01:34 檢舉
先用debug去看為啥a會變成不是1
habi_tw iT邦新手 5 級 ‧ 2023-02-03 23:19:58 檢舉
感謝大大的回覆~迴圈寫在W.mainloop() # 執行主程式這行下面,印出來a=True 並且會重複執行迴圈
但是放在W.mainloop() # 執行主程式這行上面,卻不能重複執行,有試過把a==1改成==True,結果一樣只執行一次
fillano iT邦超人 1 級 ‧ 2023-02-04 15:31:48 檢舉
你的程式應該不會跑進while吧?前面先var1.set(0)了,跑到while的時候a應該是0,然後繼續跑到W.mainloop()。你怎麼點按鈕,他都不會跑到while的,早就跑完了。
habi_tw iT邦新手 5 級 ‧ 2023-02-04 16:29:51 檢舉
感謝大大回覆~我將var1.set改為1就可以重複執行,但是又衍生另一個問題。
問題如下:
1.開啟程式預設打勾時,造成無限迴圈,此時程式無法變更任何參數,導致迴圈無法判斷成0進而停止迴圈
2.多定義一個函式、按鈕來達成打勾後按下開始執行,但還是會造成無限迴圈無法更改參數,這方面有解嗎? 以下是更改的地方 感謝
def run():
if var1.get() == 1:
run1()

def run1():
im = ImageGrab.grab(bbox=(2105,1054,2204,1148))
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")
time.sleep(1)
return '1'

else:
cv2.imwrite("b.png",diff)
print("NO")
time.sleep(0.5)
return '0'

def run2():
A=var1.get()==1
while var1.get()==1:
a=run1()
print(a)
if a==1:
A=1
elif a==0:
A=0
print(A) # 用來觀察有無改變參數
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-18 21:20:40

你的程式碼有一個無窮迴圈,會一直執行直到程式強制結束。程式碼執行到 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() 函數會在執行完後結束。

我要發表回答

立即登入回答