Python 新手村

用 Python 打造你的遊戲

2020

小草、RexWu

Part 6

ctl12345

前情提要

def greet(name):
  print("Hello, " + str(name))
  
# main
n = input("請告訴我你的名字")
greet(n)

Greet again!

try:
  x = int(input('請輸入 x :'))
  y = int(input('請輸入 y :'))
  print(x + y)
except:
  print('輸入錯誤 請輸入整數')

所以要處理例外狀況

使用 「try」和 「except」

class

物件 - 概念

什麼是 "class"

物件

一位玩家

屬性

  • HP

  • ATK

  • DEF

  • 背包

一位玩家

功能

  • 攻擊

  • 防禦

  • 補血

  • 撿東西

class

物件 - 實作

python 呈現物件

class 物件名稱:

        建構

        函數1

        函數2

        ...

class Player:

  def __init__(self, hp, atk, def_):
    self.hp = hp
    self.atk = atk
    self.def_ = def_

  def attack(self, target):
    target.hp = target.def_ - self.atk
    
  def greet(self):
	print("Player 說:早安我的朋友!")

簡單的 Player 物件

init "初始化"

  def __init__(self, hp, atk, def_):

物件本體

參數們

init "初始化"

    self.hp = hp
    self.atk = atk
    self.def_ = def_

設定玩家的 hp

設定玩家的 atk

設定玩家的 def

辣個 self.xxx

取得物件本身的值

e.g. 

self.hp -> 取得該物件的 hp 變數

Player1 = Player(10, 5, 2)
# 新增一個 hp = 10 atk = 5 def_ = 2 的玩家

Player2 = Player(20, 10, 5)
# 新增一個 hp = 20 atk = 10 def_ = 5 的玩家

新增 Player

取得物件的值

player1 = Player(10, 5, 2)
# 新增一個 hp = 10 atk = 5 def_ = 2 的玩家

player2 = Player(20, 10, 5)
# 新增一個 hp = 20 atk = 10 def_ = 5 的玩家

print(player1.hp) # 顯示 player1 的 hp
print(player2.hp) # 顯示 player2 的 hp

其實很像辣個

self.xxx

只是變成

物件變數.xxx

實作一下剛剛的 Player

並新增一個可以 print 出玩家 hp的函數

以及在初始化時,加入玩家名稱

取得物件的值 cont’d.

你可以這麼做

print (player1.hp)

Why

def getHp(self):

        print(self.hp)

因為

player1.getHp() 直覺很多

而且

在定義物件外直接取值不是一個好習慣

class Player:

  def __init__(self, hp, atk, def_):
    self.hp = hp
    self.atk = atk
    self.def_ = def_

  def attack(self, target):
    target.hp = target.def_ - self.atk
    
  def greet(self):
	print("Player 說:早安我的朋友!")

關於那個 attack

傳入一個物件,並修改他的值

function 一樣可以回傳

class Player:

  # 略過上面的東西
  
  def getHpVal(self):
    return self.hp

GUI

終於看得到惹

GUI

Graphical User Interface

CLI

Command Line Interface

Python's easiest GUI

Tkinter

import tkinter as tk

window = tk.Tk()

msg = tk.Label(master=window, text="你好!")
msg.pack()

window.mainloop()

簡單的視窗

import tkinter as tk

window = tk.Tk()
window.geometry("500x500")

msg = tk.Label(master=window, text="你好!")
msg.pack()

window.mainloop()

簡單的視窗(指定大小)

import tkinter as tk

window = tk.Tk()
window.geometry("500x500")

msg = tk.Label(master=window, text="你好!")
msg.pack()

window.mainloop()

文字標籤

import tkinter as tk

window = tk.Tk()

def clk():
  print("尼亂按 ><")

btn = tk.Button(master=window, text="按我!", command=clk)
msg.pack()

window.mainloop()

按鈕

import tkinter as tk

window = tk.Tk()

def clk():
  btn["text"] = "不要亂按 ><"


btn = tk.Button(master=window, text="按我!", command=clk)
btn.pack()

window.mainloop()

變更元件文字

frame

 

frame - side

import tkinter as tk

window = tk.Tk()
window.geometry("300x300")

label0 = tk.Label(text="我在最上面!")
label0.pack(side = tk.TOP)

label3 = tk.Label(text="我在左邊 ( ~'ω')~ ")
label3.pack(side = tk.LEFT)

label4 = tk.Label(text=" ~('ω'~ ) 窩在右邊")
label4.pack(side = tk.RIGHT)

window.mainloop()

frame - grid

import tkinter as tk

window = tk.Tk()
window.geometry("500x500")

frame = tk.Frame()
frame.grid(row=0, column=0)
label = tk.Label(master=frame, text="左上角")
label.pack()

frame = tk.Frame()
frame.grid(row=1, column=1)
label = tk.Label(master=frame, text="右下角")
label.pack()

window.mainloop()

frame - grid 結合迴圈

import tkinter as tk

window = tk.Tk()
window.geometry("500x500")

def clk():
  print("不要亂按><")

for i in range(3):
  for j in range(3):
    frame = tk.Frame()
    frame.grid(row=i, column=j)
    btn = tk.Button(master=frame, text=str(i) + str(j), width=5, command=clk)
    btn.pack()

window.mainloop()

九宮格的話...上禮拜的OOXX?

開始挑戰前

你會需要一個技能

小弟我在此授與這個技能給各位

剛剛的

import tkinter as tk

window = tk.Tk()
window.geometry("500x500")

def clk():
  print("不要亂按><")

for i in range(3):
  for j in range(3):
    frame = tk.Frame()
    frame.grid(row=i, column=j)
    btn = tk.Button(master=frame, text=str(i) + str(j), width=5, command=clk)
    btn.pack()

window.mainloop()

按鈕好多 怎麼知道誰是誰?

functools 套件

from functools import partial

def f(x, y):
  return x * y

# 將參數"凍結"
f = partial(f, 10, 10)
print(f())

凍結住 command 的參數

for i in range(3):
  for j in range(3):
    frame = tk.Frame()
    frame.grid(row=i, column=j)
    btn = tk.Button(master=frame, 
                    text=str(i) + str(j), 
                    width=10, 
                    height=10, 
                    command=partial(clk, i, j)
                    )
    btn.pack()

這樣還不夠喔!

 ( ゚Д゚#) 

需要一個方法把按鈕記起來

 ζ*'ヮ')ζ 

有按鈕座標了 但是

用 list 吧

使用 2D List 記住 gird 元件

btnAry = []
for i in range(3):
  row = []
  for j in range(3):
    frame = tk.Frame()
    frame.grid(row=i, column=j)
    btn = tk.Button( # 後面省略.... 
    row.append(btn)
    btn.pack()
  btnAry.append(row)

開始挑戰吧!

還有更多 gui 教學

期待下次見面 ( ~'ω')~ 

下課囉~

來點個名

 

1514

Copy of Python 新手村 2020 Part 6

By Rex Wu

Copy of Python 新手村 2020 Part 6

  • 65