선배님들. 파이썬 Tkinter 버튼 멈춤현상 질문드립니다.

조회수 2632회

안녕하세요.

파이썬 공부중인 입문자 입니다.

다름이 아니라 파이선 Tkinter 이용해서 간단한 스크린샷 찍는 프로그램을 만드는 중입니다.

하기와 같은 내용으로 멈춤현상이 발생하여 이렇게 선배님들에게 질문드립니다.

프로그램 동작 순서는 하기와 같습니다.

윈도우창 띄움 -> 시작버튼 클릭 -> 마우스 휠 버튼 감시 -> 마우스 휠 버튼 클릭시 스크린샷 찍기 -> 멈춤현상 발생

(제가 구현원하는 방식은 단순히 시작버튼을 누르고 나서 마우스 휠 버튼을 누를때마다 계속 스크린샷을 찍는게 목표입니다.)

아래는 소스코드 입니다.

import pyautogui
import time  
import mouse 
import threading
from tkinter import *


# 윈도우 창 생성 및 버튼 화면 조절
root = Tk() 
root.title("Wheel Button SC 찍기") 
root.geometry("540x480+100+100")
root.resizable(False,FALSE)


# 시작 버튼 누르면 마우스 휠버튼 감시 ->휠 버튼 클릭시 스크린샷 찍기
def btnscreen(): 
    while True: 
        if mouse.is_pressed("middle"):
            pyautogui.hotkey('win','prtscr')

        if pyautogui.press('z'):
            break    


# 시작 버튼 생성
btn6 = Button(root,text='시작버튼',command=btnscreen) 
btn6.pack()

# 윈도우창 계속 띄우기
root.mainloop()

(구글링하여보니, 스레드와 타이머를 구현하라고 나와있지만 막상 현재 코드에 어떻게 적용할지 막막합니다.)

이상입니다. 선배님들 답변 부탁드립니다. 감사합니다.

2 답변

  • threading 모듈을 사용하시면 됩니다.

    import threding
    def th():
        th = threading.Thread(target=btnscreen)
        th.daemon = True
        th.start()
    
    def btnscreen(): 
        while True:
         if mouse.is_pressed("middle"): 
            pyautogui.hotkey('win','prtscr')
    
         if pyautogui.press('z'):
            break
    btn6 = Button(root,text='시작버튼',command=th)
    btn6.pack()
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 와.. 김정호 선배님 감사드립니다. 업무로 인해 까먹고 있다고 지금 봤습니다.! 귀중한 시간 답변 정말 감사드립니다! 코드 까지 이렇게 예시로 보여주셔서 더 더욱 감사드립니다!!! ^^ 알 수 없는 사용자 2021.2.26 13:36
  • tkinter에 대해서는 잘 모르고.. 제 실력도 부족하고 질문의 내용도 부족하지만.. 혹시나 해서 글을 남깁니다.

    멈춘다는게 프로그램이 멈춘다는 것인지? 컴퓨터가 멈춘다는 것인지요?

    컴퓨터가 멈춰버릴까 무서워 코드 실행은 못 해 보겠네요..

    코드를 봤을 때 마우스 휠 클릭시 btnscreen()이 작동하는 것으로 보이는데.. 해당 부분에 문제가 있지 않나 싶습니다.

    def btnscreen(): 
        while True: 
            if mouse.is_pressed("middle"):
                pyautogui.hotkey('win','prtscr')
            if pyautogui.press('z'):
                break
        """
        z 키를 누르지 않는 이상 break는 작동하지 않기 때문에 무한 루프할 것으로 보입니다.
    
        즉, 추가적인 조작이 없다면
        while True:
            pass
        와 동일한 상태이기 때문에 해당 작업시 cpu 부하가 예상됩니다.
        """
    
    

    다음과 같이 수정해야하지 않나 생각됩니다.

    def btnscreen(): 
        if mouse.is_pressed("middle"):
            pyautogui.hotkey('win','prtscr')
    
    • 안녕하세요. 답변 정말 감사드립니다. 우선 알려주신 코드로 실행을 하면 버튼을 누름과 동시에 프로그램이 로직에서 나와서 마우스 휠키를 눌러도 스크린샷이 찍히지 않는 문제가 발생합니다..(즉 말씀하신것처럼 무한루프 때문에 작동이 멈추는 현상은 맞습니다.. 하지만 버튼을 누르면 로직이 계속 돌수 있게 하는 부분이 있어야 되더라구요 ㅠㅠ) 이러한 현상이 있어서 버튼을 누르면 While 문 반복으로 인해 휠 키를 누를 경우 스크린샷이 찍게 한거였지만 구글링에 찾아 보니 While 문에 들어가면 계속 로직이 빠져나가지 못하여 프로그램 멈춤 현상이 발생한다고 합니다.. 그래서 얻은 결론은 스레드 및 타이머 구현을 하며 로직을 만드는 것인데 이 방법을 제가 작성한 로직에 어떻게 적용을 해야될지 막막해서 이렇게 질문 드렸습니다.. 다시 한번 귀중한 시간 내주셔서 답변주셔서 감사드립니다. 알 수 없는 사용자 2021.2.16 17:49
    • 제 생각에는 코드 구조를 싹다 변경하셔야 할 것 같습니다. while 문으로 프로그램이 살아있게 하고, 특정 입력이 발생하면 btnscreen()을 작동시키도록요. 그러면 btnscreen()에는 스크린샷 촬영 명령만 넣어두면 됩니다. 안타깝게도 특정 입력이 발생했을 때 동작하도록 하는 방법을 제가 알지 못해서 이에 대해서는 어떻게 알려드릴 수 있는게 없네요. ㅜㅜ 초보자 2021.2.16 18:05
    • 네 답변 감사합니다! 저도 버튼 사용을 제외시켜서 While 문을 사용해야 할 것 같습니다 ! 이렇게 관심 가져주셔서 정말 감사드립니다 !! 좋은 하루 되세요! 알 수 없는 사용자 2021.2.19 13:52

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)