{"id":26833403,"url":"https://github.com/mr-won/tk_aimgame","last_synced_at":"2025-03-30T15:28:54.961Z","repository":{"id":138423050,"uuid":"454669203","full_name":"mr-won/Tk_AimGame","owner":"mr-won","description":"tkinter와 Python 언어로 에임(조준) 연습하는 게임 만들기 (exe파일)","archived":false,"fork":false,"pushed_at":"2022-02-02T08:00:28.000Z","size":11519,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T02:27:15.359Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TeX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mr-won.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-02-02T06:40:11.000Z","updated_at":"2022-02-02T08:00:32.000Z","dependencies_parsed_at":"2023-08-20T14:07:14.671Z","dependency_job_id":null,"html_url":"https://github.com/mr-won/Tk_AimGame","commit_stats":null,"previous_names":["wonttan/tk_aimgame","wonchihyeon/tk_aimgame","chihyunwon/tk_aimgame","mr-won/tk_aimgame","chihyeonwon/tk_aimgame"],"tags_count":null,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FTk_AimGame","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FTk_AimGame/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FTk_AimGame/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FTk_AimGame/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mr-won","download_url":"https://codeload.github.com/mr-won/Tk_AimGame/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246337861,"owners_count":20761282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-30T15:28:54.276Z","updated_at":"2025-03-30T15:28:54.945Z","avatar_url":"https://github.com/mr-won.png","language":"TeX","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tk_AimGame\ntkinter와 Python 언어로 에임(조준) 연습하는 게임 만들기 (exe파일)\n\n## 시작 창화면 구성 및 설계\n\n### 구현할 기능     \n   \n표적의 등장 개수를 entry 입력창에 입력합니다.   \n   \n아래의 시작 버튼을 누르면 게임 화면으로 넘어갑니다.\n \n ### 처음에 등장하는 창 생성\n \n ```python\n from tkinter import *\nwin = Tk()\nwin.title(\"AIM_GAME\")\nwin.geometry(\"550x150\")\nwin.option_add(\"*Font\", \"궁서 20\")\n\n\nwin.mainloop()\n```   \n![aimgame_window](https://user-images.githubusercontent.com/58906858/152107147-7acb16f2-6249-4ba2-8b44-147df3734174.png)\n\n### 이제 여기에 표적 개수를 글자를 표시하기 위해 라벨을 하나 만들어 줍니다.   \n   \n위치는 grid()함수를 사용합니다.   \n```python\n# Label\nlab = Label(win)\nlab.config(text=\"표적 개수\")\nlab.grid(column=0, row=0, padx=20, pady=20)\n```   \n![aimgame_rabel](https://user-images.githubusercontent.com/58906858/152107558-c676a277-aa9a-47b2-bbcd-ef785328f27b.png)   \n   \n### 표적 개수를 입력하는 입력창을 만들어 줍니다.\n   \n위치는 마찬가지로 grid()함수를 사용합니다.   \n```python\n# Entry\nent = Entry(win)\nent.grid(column=1, row=0, padx=20, pady=20)\n```   \n![aimgame_entry](https://user-images.githubusercontent.com/58906858/152107788-7bb29a1f-e06b-413f-a63b-9e39feec1514.png)   \n\n## 시작 버튼을 만들어 줍니다.\n\n```python\n# Button\nbtn = Button(win)\nbtn.config(text=\"시작\")\nbtn.grid(column=0, row=1, columnspan=2)\n```   \n![aimgame_button](https://user-images.githubusercontent.com/58906858/152108711-fb79a520-35db-4509-825b-ca5b886a28ef.png)\n\n### 버튼이 눌러졌을 때 실행할 함수 생성\n\n버튼이 눌러졌을 때 entry에 입력된 숫자를 변수에 저장하고 모든 위젯을 화면에서 없앰과 동시에 화면 크기를 키우는 함수를 구현합니다.   \n```python\ndef btn_f():\n    global num_t # num_t 변수를 전역변수로 지정\n    num_t = int(ent.get()) # 입력창에 입력된 문자열을 숫자로 바꿔서 저장\n    for widget in win.grid_slaves(): # 3개의 위젯이 요소로 있는 리스트 [label, entry, button]\n        widget.destroy() # 위젯 요소를 차례로 파괴합니다.\n    win.geometry(\"500x500\") \n```\n\n만들어진 btn_f 함수를 버튼의 커맨드옵션으로 버튼이 클릭됬을 때 실행되도록 합니다.\n```python\nbtn.config(command=btn_f)\n```   \n   \n버튼을 클릭하면 모든 위젯이 화면에서 사라지고 화면의 크기가 커집니다.\n   \n### 버튼이 눌러졌을 때 랜덤한 위치에 버튼을 생성하는 함수 생성   \n   \n먼저 random 모듈을 사용하기위해 import 해줍니다.\n```python\nimport random\n```   \n   \n랜덤한 위치에 버튼을 생성하는 함수를 생성하고  btn_f 안에서 함수를 실행합니다.\n```python\ndef ran_btn():\n    btn = Button(win)\n    btn.config(bg=\"red\")\n    btn.place(relx=random.random(), rely=random.random())\n    \ndef btn_f():\n    global num_t  # num_t 변수를 전역변수로 지정\n    num_t = int(ent.get())  # 입력창에 입력된 문자열을 숫자로 바꿔서 저장\n    # 3개의 위젯이 요소로 있는 리스트 [label, entry, button]\n    for widget in win.grid_slaves():\n        widget.destroy()  # 위젯 요소를 차례로 파괴합니다.\n    win.geometry(\"500x500\")  # 창의 크기를 500x500로 설정합니다.\n    ran_btn()\n    \n```   \n   \n입력창에 숫자를 입력하고 시작버튼을 누르면 위젯이 사라지고 창이 커짐과 동시에 화면의 랜덤한 위치에 버튼이 생성됩니다.   \n   \n![aimgame_random](https://user-images.githubusercontent.com/58906858/152111134-06e3afb2-767d-4c88-a1e8-eed46e616cec.png)\n\n### 랜덤한 위치에 생성된 버튼을 제거하고 새로운 버튼을 만드는 함수 생성과 시간 함수로 클리어 시간 표시\n\n버튼이 클릭된 시간을 구하기위해 datetime모듈을 import 해줍니다.   \n```python\nimport datetime from datetime\n```   \n   \n\n랜덤한 위치에 생성된 버튼을 제거하고 다른 새로운 버튼을 만드는 함수를 생성합니다.   \n   \n```python\ndef other_btn():\n    global count\n    # 카운트된 버튼의 숫자가 입력창에 입력한 숫자보다 작을 때\n    if count \u003c num_t:\n        count += 1\n        btn.destroy()\n        ran_btn()\n    else:  # 새로 버튼을 실행하지 않도록 설정\n        final = datetime.now()  # 종료 시간\n        dif_sec = (final-start).total_seconds()\n        btn.destroy()\n        lab = Label(win)\n        lab.config(text=\"Clear \" + str(dif_sec)+\"초\")\n        lab.pack(pady=230)\n    # 버튼을 클릭했을 때 위젯을 모두 없애고 창크기를 키워주는 함수\n\n\ndef btn_f():\n    global start\n    global num_t  # num_t 변수를 전역변수로 지정\n    num_t = int(ent.get())  # 입력창에 입력된 문자열을 숫자로 바꿔서 저장\n    # 3개의 위젯이 요소로 있는 리스트 [label, entry, button]\n    for widget in win.grid_slaves():\n        widget.destroy()  # 위젯 요소를 차례로 파괴합니다.\n    win.geometry(\"500x500\")  # 창의 크기를 500x500로 설정합니다.\n    ran_btn()\n    start = datetime.now()  # 스타트 시간\n```\n\n스타트 시간과 종료 시간을 구해서 뺀 값을 total_seconds() 함수를 사용해서 간단하게 초를 구한뒤 clear 메시지 뒤에 넣어줬습니다.   \n\n## 최종 코드와 프로그램 실사용 모습입니다.\n\n다음은 최종 코드입니다.\n```python\nfrom tkinter import *\nimport random\nfrom datetime import datetime\nwin = Tk()\nwin.title(\"AIM_GAME\")\nwin.geometry(\"550x150\")\nwin.option_add(\"*Font\", \"궁서 20\")\n\n# Label\nlab = Label(win)\nlab.config(text=\"표적 개수\")\nlab.grid(column=0, row=0, padx=20, pady=20)\n\n# Entry\nent = Entry(win)\nent.grid(column=1, row=0, padx=20, pady=20)\n\n# Button\n\ncount = 1\n\n# 버튼을 클릭했을 때 이전 버튼을 삭제하고 새로운 버튼을 생성하는 함수\n\n\ndef other_btn():\n    global count\n    # 카운트된 버튼의 숫자가 입력창에 입력한 숫자보다 작을 때\n    if count \u003c num_t:\n        count += 1\n        btn.destroy()\n        ran_btn()\n    else:  # 새로 버튼을 실행하지 않도록 설정\n        final = datetime.now()  # 종료 시간\n        dif_sec = (final-start).total_seconds()\n        btn.destroy()\n        lab = Label(win)\n        lab.config(text=\"Clear \" + str(dif_sec)+\"초\")\n        lab.pack(pady=230)\n# 랜덤한 위치에 버튼을 생성하는 함수\n\n\ndef ran_btn():\n    global btn\n    btn = Button(win)\n    btn.config(bg=\"red\")\n    btn.config(command=other_btn)\n    btn.config(text=count)\n    btn.place(relx=random.random(), rely=random.random())\n\n# 버튼을 클릭했을 때 위젯을 모두 없애고 창크기를 키워주는 함수\n\n\ndef btn_f():\n    global start\n    global num_t  # num_t 변수를 전역변수로 지정\n    num_t = int(ent.get())  # 입력창에 입력된 문자열을 숫자로 바꿔서 저장\n    # 3개의 위젯이 요소로 있는 리스트 [label, entry, button]\n    for widget in win.grid_slaves():\n        widget.destroy()  # 위젯 요소를 차례로 파괴합니다.\n    win.geometry(\"500x500\")  # 창의 크기를 500x500로 설정합니다.\n    ran_btn()\n    start = datetime.now()  # 스타트 시간\n\n\nbtn = Button(win)\nbtn.config(text=\"시작\")\nbtn.config(command=btn_f)\nbtn.grid(column=0, row=1, columnspan=2)\n\nwin.mainloop()\n```   \n   \n프로그램을 실행하면 다음과 같습니다.   \n![aimgame_button](https://user-images.githubusercontent.com/58906858/152113789-3822ce82-1500-4238-a3af-e35bf2a54728.png)\n\n표적 개수 입력창에 3을 입력하고 버튼을 누릅니다. 버튼이 3개가 랜덤한 위치에 생성되고 마지막으로 클리어 타임이 기록됩니다.\n\n### pyinstaller을 사용해서 exe 파일로 만들기   \n   \npyinstaller를 사용하기 위해서 다운로드 해줍니다.\n```python\npip install pyinstaller\n```   \n\n만든 프로그램을 하나의 프로그램(.exe)와 옵션을 설정하지 않게 pyinstaller의 옵션을 구성해서 실행합니다.   \n```python\npyinstaller --onefile --noconsole tk_aimgame.py\n```   \n   \n실행을 하면 생성되는 dist 파일안에 tk_aimgame.exe 응용프로그램이 생성됩니다.\n\n\n추후에 시간이 된다면 게임화면으로 되돌아가는 버튼을 구현할 예정입니다. 2022-02-02 최종수정\n마찬가지로 랜덤으로 생성되는 버튼의 위치가 화면을 벗어나는 것도 수정할 예정 2022-02-02 최종수정\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Ftk_aimgame","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmr-won%2Ftk_aimgame","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Ftk_aimgame/lists"}