LoginSignup
11
9

More than 3 years have passed since last update.

【Python】Tkinterによる100行で作るGUIアプリ「おみくじ」

Last updated at Posted at 2019-06-09

はじめに

こんにちは。
今回は「おみくじ」を作っていきたいと思います。
完成するとこんな感じに動きます!

おみくじ.gif

くじを引くのボタンをクリックすると、くじを引くことができます。

環境

  • Windows 10 home
  • Python 3.7.1

「おみくじ」の制作

インポート

使うライブラリは以下の3つです。

import tkinter as tk
import time
import random as rd

ウィンドウの作成

import tkinter as tk
import time
import random as rd

class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        self.width=self.height=300
        master.geometry(str(self.width)+"x"+str(self.height))
        master.title("おみくじ")


def main():
    win = tk.Tk()
    app = Application(master = win)
    app.mainloop()


if __name__ == "__main__":

    main()

このプログラムでウィンドウを作っていきます。
サイズは300×300です。タイトル名はおみくじです。
詳しくはPythonによるTkinterを使った雛形(クラス化手法)の記事をご参照ください。

Fortuneクラスに関して

class Fortune():
    def __init__(self,canvas,x,y,color,tag):
        self.canvas = canvas
        self.x = x
        self.y = y
        self.color = color
        self.tag = tag

    def createFortuneBox(self): #くじ箱を作る
        self.canvas.create_polygon(self.x,self.y,self.x+20,self.y-25,self.x+80,self.y-25,self.x+100,self.y,self.x+100,self.y+100,self.x+80,self.y+125,self.x+20,self.y+125,self.x,self.y+100,fill=self.color,tag=self.tag)
        self.createFortuneText()

    def createFortuneText(self): #おみくじの文字を表示
        return self.canvas.create_text(self.x+50,self.y+50,text="お\n\n\nじ",font=("Helvetica", 18, "bold"),fill="white",tag=self.tag)

    def drawLots(self): #くじ箱の動き
        sleepTime=0.03

        for i in range(10):
            self.canvas.move(self.tag,0,5)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,-5,0)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,0,-5)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,5,0)
            time.sleep(sleepTime)
            self.canvas.update()

        self.resultLots()

    def resultLots(self): #結果を表示
        resultNumber=rd.randint(1,28)

        if resultNumber==1:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="yellow",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="大\n吉",font=("Helvetica", 30, "bold"),fill="yellow",tag="resultText")
        elif resultNumber>1 and resultNumber<=3:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="orange",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="吉",font=("Helvetica", 30, "bold"),fill="orange",tag="resultText")
        elif resultNumber>3 and resultNumber<=6:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="pink",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="中\n吉",font=("Helvetica", 30, "bold"),fill="pink",tag="resultText")
        elif resultNumber>6 and resultNumber<=10:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="green",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="小\n吉",font=("Helvetica", 30, "bold"),fill="green",tag="resultText")
        elif resultNumber>10 and resultNumber<=15:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="blue",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="末\n吉",font=("Helvetica", 30, "bold"),fill="blue",tag="resultText")
        elif resultNumber>15 and resultNumber<=21:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="white",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="凶",font=("Helvetica", 30, "bold"),fill="white",tag="resultText")
        else:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="gray",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="大\n凶",font=("Helvetica", 30, "bold"),fill="gray",tag="resultText")

このFortuneクラスでおみくじの機能全般をまとめています。

  • createFortuneBoxメソッドはくじ箱を作る関数です。
  • createFortuneTextメソッドはくじ箱に書かれているおみくじという文字を表示する関数です。
  • drawLotsメソッドはボタンをクリックした際に呼ばれる関数で、揺れるような動きをしたあとに、resultLotsメソッドを呼ぶ関数です。
  • resultLotsメソッドはくじの結果を表示する関数で、以下のような確率でくじを引きます。

1/28 : 大吉
2/28 : 吉
3/28 : 中吉
4/28 : 小吉
5/28 : 末吉
6/28 : 凶
7/28 : 大凶

完成したプログラム

こちらが完成したプログラムになります。

おみくじ.py
import tkinter as tk
import time
import random as rd


class Fortune():
    def __init__(self,canvas,x,y,color,tag):
        self.canvas = canvas
        self.x = x
        self.y = y
        self.color = color
        self.tag = tag

    def createFortuneBox(self): #くじ箱を作る
        self.canvas.create_polygon(self.x,self.y,self.x+20,self.y-25,self.x+80,self.y-25,self.x+100,self.y,self.x+100,self.y+100,self.x+80,self.y+125,self.x+20,self.y+125,self.x,self.y+100,fill=self.color,tag=self.tag)
        self.createFortuneText()

    def createFortuneText(self): #おみくじの文字を表示
        return self.canvas.create_text(self.x+50,self.y+50,text="お\n\n\nじ",font=("Helvetica", 18, "bold"),fill="white",tag=self.tag)

    def drawLots(self): #くじ箱の動き
        sleepTime=0.03

        for i in range(10):
            self.canvas.move(self.tag,0,5)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,-5,0)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,0,-5)
            time.sleep(sleepTime)
            self.canvas.update()
            self.canvas.move(self.tag,5,0)
            time.sleep(sleepTime)
            self.canvas.update()

        self.resultLots()

    def resultLots(self): #結果を表示
        resultNumber=rd.randint(1,28)

        if resultNumber==1:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="yellow",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="大\n吉",font=("Helvetica", 30, "bold"),fill="yellow",tag="resultText")
        elif resultNumber>1 and resultNumber<=3:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="orange",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="吉",font=("Helvetica", 30, "bold"),fill="orange",tag="resultText")
        elif resultNumber>3 and resultNumber<=6:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="pink",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="中\n吉",font=("Helvetica", 30, "bold"),fill="pink",tag="resultText")
        elif resultNumber>6 and resultNumber<=10:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="green",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="小\n吉",font=("Helvetica", 30, "bold"),fill="green",tag="resultText")
        elif resultNumber>10 and resultNumber<=15:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="blue",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="末\n吉",font=("Helvetica", 30, "bold"),fill="blue",tag="resultText")
        elif resultNumber>15 and resultNumber<=21:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="white",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="凶",font=("Helvetica", 30, "bold"),fill="white",tag="resultText")
        else:
            self.canvas.create_polygon(self.x+25,self.y-50,self.x+75,self.y-50,self.x+75,self.y-25,self.x+25,self.y-25,fill="gray",tag="lot")
            self.canvas.create_text(self.x+150,self.y,text="大\n凶",font=("Helvetica", 30, "bold"),fill="gray",tag="resultText")


class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        self.width=self.height=300
        self.buttonClick=True

        master.geometry(str(self.width)+"x"+str(self.height))
        master.title("おみくじ")

        self.canvas = tk.Canvas(master,width=self.width,height=self.height,bg="black") #キャンバスの作成
        self.canvas.pack()

        self.omikuji = Fortune(self.canvas,100,90,"red","omikuji") #インスタンスomikujiの生成
        self.omikuji.createFortuneBox()

        self.drawButton = tk.Button(text="くじを引く",command=self.drawButtonClick,width=10) #くじを引くボタンの作成
        self.drawButton.place(x=110, y=250)

    def drawButtonClick(self): #ボタンが押されたら
        if self.buttonClick:
            self.buttonClick=False
            self.canvas.delete("lot")
            self.canvas.delete("resultText")
            self.omikuji.drawLots()
            self.buttonClick=True

def main():
    win = tk.Tk()
    app = Application(master=win)
    app.mainloop()

if __name__ == "__main__":
    main()

以上でおみくじは完成になります。
ここまで読んでいただき、ありがとうございました。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9