활연개랑

[python(파이썬)] tikinter에서 keyboard event 동작하기 (키 누르면 이벤트 실행) 함수랑 결합 / -jupiter notebook 본문

Python

[python(파이썬)] tikinter에서 keyboard event 동작하기 (키 누르면 이벤트 실행) 함수랑 결합 / -jupiter notebook

승해tmdhey 2021. 7. 4. 02:27
반응형

하... 이걸로 얼마나 많은 구글링을 하고 얼마나 많은 실패를 했는지.... 

순 구글링 시간만 20시간은 족히 넘을듯 싶습니다...

이번에..... 이걸하면서 느낀 점은.... 안되면 한가지만 고집하지 말자... 그게 더 시간이 오래걸린다는것을^^마음에 새기도록 하겠습니다.

 

본론으로 돌아가서 

제가 만들고있는 것은 python에서 tikinter를 사용하여 큐브 2D 단면도를 작성하는 것이었는데요,

2d 단면도가 켜져 있는 tikinter에서 키보드(큐브 공식인 영어) 를 누르면 그 방향으로 돌아가는 단면도로 바뀌는 것을 만들고싶었습니다. 

만약  tikinter 화면에서 F를 누르면 앞면이 오른쪽으로 90도 돌아간 큐브의 단면도로 바뀌는 것이죠.

 

여기서 제가 겪었던 문제는, keyboard를 install했는데도 gui는 제대로 뜨지만, 키보드를 눌러도 함수가 실행이 안되는 것이었답니다...

 

keyboard를 사용하시려면 일단 명령 프롬프트(cmd)에 들어가셔서,

사용자 환경으로 변경 하시고 > conda activate ***(사용자환경 이름)

키보드 모듈을 인스톨하면 됩니다.> conda install keyboard (pip3 install keyboard)

-> processing(Y/N)에서 Y를 누르시면  인스톨 완료입니다

 

여기서 문제였던 코드를 보여드리겠습니다. 

while 1:
    def move_1():
        global CC,cm
        cm=[[[CC[3][0][0],CC[3][0][1],CC[3][0][2]],[CC[0][1][0],CC[0][1][1],CC[0][1][2]],[CC[0][2][0],CC[0][2][1],CC[0][2][2]]], 
            [[CC[5][2][2],CC[5][2][1],CC[5][2][0]],[CC[1][1][0],CC[1][1][1],CC[1][1][2]],[CC[1][2][0],CC[1][2][1],CC[1][2][2]]],
            [[CC[2][2][0],CC[2][1][0],CC[2][0][0]],[CC[2][2][1],CC[2][1][1],CC[2][0][1]],[CC[2][2][2],CC[2][1][2],CC[2][0][2]]],
            [[CC[1][0][0],CC[1][0][1],CC[1][0][2]],[CC[3][1][0],CC[3][1][1],CC[3][1][2]],[CC[3][2][0],CC[3][2][1],CC[3][2][2]]],
            [[CC[4][0][0],CC[4][0][1],CC[4][0][2]],[CC[4][1][0],CC[4][1][1],CC[4][1][2]],[CC[4][2][0],CC[4][2][1],CC[4][2][2]]],
            [[CC[5][0][0],CC[5][0][1],CC[5][0][2]],[CC[5][1][0],CC[5][1][1],CC[5][1][2]],[CC[0][0][2],CC[0][0][1],CC[0][0][0]]]]

        CC=cm
        result= Cubegui()
            
    if keyboard.is_pressed("l"):
        move_1()
    break
    

이 부분 입니다.

이렇게 하면 문법적인 문제는 없는건지., 실행은 되더라구요. Tkinter가 켜지긴 합니다.

그리고 keyboard.is_pressed("I")를 따로 빼서 아래와 같이 실행시켜보면 또 실행되더라구요.

if keyboard.is_pressed("I"):
	print('hello')

* 참고로 주피터 노트북에서 이와같은 코드를 실행시키시려면 키보드I를 누르시면서 실행버튼을 누르면 됩니다. 

그러면 hello가 켜져요!  (이 방법을 몰라서 구글링 열심히 했습니다..)

 

그리고 move_1함수가 되는지 확인하려고 

아래 코드와같이 마지막 tikinter 실행 코드에 move_1()함수를 넣어실행해보니 함수가 실행되어 gui나타났습니다.

if start==0:
    Cubegui(),move_1()
    
fenetre.mainloop()

 

 

그럼 두 개 모두 이상이 없는데 왜 안되는지 .... 답답하고....구글링도 계속하고... 힘들었는데! 

다른 분의 도움을 받았어요. 질문이라는건 참 좋은 행동같아요.. 

내일 커피라도 하나 사드려야겠습니다. 

 

방법은 

 

if keyboard.is_pressed("I"):
	move_1()

이 부분을 

keyboard.add_hotkey('I', move_1)

이렇게 고치면 됩니다!

 

왜 위에 코드는 안되는지는 잘 모르겠습니다만 , 문법적인 오류는 아닌듯싶고

그냥 아래를 씁시다! 

 

이걸 보시는 분들은 쓸데없는 고생 하지 않으시길 바라요!

 

 

전체 코드는 너무 길어서 완성하면 깃허브에 올리고 주소 남기도록 하겠습니다~

while 1:
    def move_1():
        global CC,cm
        cm=[[[CC[3][0][0],CC[3][0][1],CC[3][0][2]],[CC[0][1][0],CC[0][1][1],CC[0][1][2]],[CC[0][2][0],CC[0][2][1],CC[0][2][2]]], 
            [[CC[5][2][2],CC[5][2][1],CC[5][2][0]],[CC[1][1][0],CC[1][1][1],CC[1][1][2]],[CC[1][2][0],CC[1][2][1],CC[1][2][2]]],
            [[CC[2][2][0],CC[2][1][0],CC[2][0][0]],[CC[2][2][1],CC[2][1][1],CC[2][0][1]],[CC[2][2][2],CC[2][1][2],CC[2][0][2]]],
            [[CC[1][0][0],CC[1][0][1],CC[1][0][2]],[CC[3][1][0],CC[3][1][1],CC[3][1][2]],[CC[3][2][0],CC[3][2][1],CC[3][2][2]]],
            [[CC[4][0][0],CC[4][0][1],CC[4][0][2]],[CC[4][1][0],CC[4][1][1],CC[4][1][2]],[CC[4][2][0],CC[4][2][1],CC[4][2][2]]],
            [[CC[5][0][0],CC[5][0][1],CC[5][0][2]],[CC[5][1][0],CC[5][1][1],CC[5][1][2]],[CC[0][0][2],CC[0][0][1],CC[0][0][0]]]]

        CC=cm
        result= Cubegui()
            
    keyboard.add_hotkey('I', move_1)
    break