Python3 - 函数以及GUI_TKINTER(第四天)

Posted 韩俊强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 - 函数以及GUI_TKINTER(第四天)相关的知识,希望对你有一定的参考价值。

文章目录

1.函数

函数 — 把一段具有独立功能的代码进行封装,便于使用这个功能的时候直接调用

例如:

# 圆的面积 --- S = π * r ** 2 需要知道r半径

# r = 3 的面积
# S = 3.14 * 3 ** 2
# print(S)
#
# r = 5 的面积
# S = 3.14 * 5 ** 2
# print(S)
1.函数分为两种:
    系统函数 --- Python环境中自带的
        print
        input
        ord
        id
        type
    自定义函数
        格式: def 函数名(形式参数1,形式参数2,形式参数3...形式参数n):
                    功能体
                    return 功能的运算结果
        结果:
             def --- python关键字, 用语定义函数的关键字
             函数名 ---- 自定义函数名字, 必须遵守标识符规范
                        命名规范: 字母是小写的, 单词和单词之间使用下划线隔开
             () --- 必须有
             形式参数 ---- 形参, 是一个变量, 接受参与功能运算的数据的功能中未知项的个数,决定形式的个数
             实际参数 ---- 实参, 调用这个功能的时候,给形参赋值的具体就是实参
             return ---- 作用是结束函数,并把功能运算结果返回到调用函数的位置
                         如果函数中不需要调用的位置返回值, 这个retun 是可以省略的,或者还可以写成return None

# print(print('1')) # 1 None

# 圆的面积封装, 声明函数
def get_area(r):
    S = 3.1415926 * r ** 2
    return S

# 调用功能 函数名(实参)
num = float(get_area(5))
print(f'半径5的面积为num:.2f')

'''
明确是否有未知项参与运算 --- 决定的是形参的个数
明确是否需要把结果返回 ---- 决定return的有无
'''

# 获取两个数的最大值
def get_max_value(value1, value2):
    # if value1 > value2:
    #     return value1
    # else:
    #     return value2
    return value1 if value1 > value2 else value2

max_value = get_max_value(12, 20)
print(max_value)

# pass掉
# res = 0 > -1 and 0 or -1
# print(res)

# 新的三元运算符 if-else组成的
# 表达式1 if 条件表达式 else 表达式2
# 判断条件表达式是否成立, 成立则表达式1, 不成立则表达式2
# res2 = 0 if 0 > -1 else -1
# print(res2)

'''
练习:
   1.封装一个函数, 比较两个数的大小, 前者大于后者返回1,前者小于后者返回-1, 两者相等返回0
   2.封装一个函数, 判断两个数是否相等
'''

def compare(a, b):
    # if a == b:
    #     return 0
    # else:
    #     return 1 if a > b else -1
    return (a > b) - (a < b)
res = compare(10, 7)
print(res)

#  2.封装一个函数, 判断两个数是否相等
def is_equal(a, b):
    # return True if a == b else False
    return a == b # 简化
res2 = is_equal(11, 11)
print(res2)

# 函数名 === 函数本身
# 函数名() --- 调用函数 --- 函数的运行结果
# 函数也是一种类型的数据
print(type(is_equal)) # <class 'function'>

# 把 is_equal 赋值个变量f
f = is_equal # 把 is_equal 对应的函数的地址赋值给了变量f, f和is_equal 具有相同的功能了
print(is_equal) # <function is_equal at 0x10813c9d0>
print(f)        # <function is_equal at 0x10813c9d0>
res3 = f(1, 2)
print(res3)

# 不要使用Python已经命名过的东西作为自己的变量名
# print = is_equal
# print(1, 2)

# 匿名函数 --- 简单格式的函数的简化
'''
lambda 形参, 形参2, ... 形参n: 功能结果
'''
f1 = lambda a, b: a == b
print(f1(4, 4))

2.默认参数

函数 — 设置形参的
参与功能运算的未知项的个数

​ 在某些场景下未知项的值是一样的, 可以给形参设置一个默认值
​ 调用函数的时候, 如果没有给这个形参赋值, 使用的就是默认值
​ 赋值了就是新值

print(10, 20, 30) # seq end
print(10, 20, 30, sep='*')

def add(a, b):
    return a + b

# 匿名函数替代上面写法
# f = lambda a, b: a+ b
# print(f(4, 5))

# def add1 (a, b, c):
#     return add(a, b) + c

# 求指定数的幂数 x ** y 默认求得是x的平方, 默认参数设置为2
def pow(x, y=2):
    return x ** y

print(pow(1, 2))
print(pow(2)) # 不填写默认值是 x ** 2
print(pow(3, 3)) # 传新值计算新值

f1 = lambda x, y=2: x ** y
print(f1(2, 3))
print(f1(2))

def check_y(data):
    if data > 10:
        return data
    else:
        return data - 1
f2 = lambda x, y=2: x ** check_y(y)
print(f2(2))
print(f2(2, 4))

3.eval功能

# str(数据) ---- 把数据转化为字符串, 在数据的最外层加引号 [12, 13, 13, 4] ---- '[12, 13, 13, 4]'

# eval(数据) ---- 解析字符串, 把字符串外层的引号去掉

data = '[12, 13, 13, 4]'
print(data, type(data)) # [12, 13, 13, 4] <class 'str'>

new_data = eval(data)  # [12, 13, 13, 4] <class 'list'>
print(new_data, type(new_data))

data = '12+3+45'
print(eval(data))

4.图形化界面GUI_TKINTER

tkinter 是Python自带的GUI, 图形化界面工具

import tkinter as tk # as 起别名
import tkinter.messagebox as tm # 信息框

# 1. 创建窗口
window = tk.Tk()

# 2. 设置窗口大小 'widthxheight+x+y'
window.geometry('500x300')
# 设置窗口标题
window.title('使用tkinter')

# 声明一个变量, 记录按钮有没有被点击
is_show = False # 没有显示

# 声明一个函数 --- 用于按钮的点击操作
def btn_click():
    print('点击了按钮')
    global is_show # 这个是用的是全局变量

    if is_show is False:
        # 在可变字符串中添加内容
        var.set('按钮被点击')  # 设置内容

        # 点击状态就要发生变化
        is_show = True
    else:
        var.set('')
        # 更改点击状态
        is_show = False

# 组件 --- 按钮 tk.Button(窗口,text='按钮文字',font=(字体,字号),width=宽度,height=高度,command=点击按钮执行的函数)
btn = tk.Button(window,text='我是个按钮', font=('楷体', 14), width=10,command=btn_click)
# 显示在窗口上
btn.pack()

def btn_click1():
    # 获取输入框内容
    content = enter1.get() # 获取输入框的内容
    var.set(content)

btn1 = tk.Button(window,text='显示数据', font=('楷体', 14), width=10,command=btn_click1)
btn1.pack()

# 组件 - Label标签
# 设置一个可变的内容组件
var = tk.StringVar() # 包含可变内容的
# textvariable 内容是可变的; bg background 背景颜色; fg foreground 字体颜色
label = tk.Label(window,textvariable=var,bg='pink', fg='red', width=30)
# label.pack()

# place把他放到某个位置
label.place(x=50, y=50, width=70, height=40)

# 输入框
# show 表示输入的内容显示的样式, 如果是None, 输入什么就显示什么, 如果设置了其他的样式就按照设置显示
enter = tk.Entry(window,show='*')
enter.pack()

enter1 = tk.Entry(window,show=None)
enter1.pack()

def clear():
    # 询问是否确定清除
    s = tm.askokcancel(title='温馨提示', message='确定清空吗?')
    if s is True:
        var.set('')


btn = tk.Button(window,text='清空label上的数据', font=('楷体', 14), width=10,command=clear)
# 显示在窗口上
btn.pack()

# 3. 显示
window.mainloop()

练习: 猜数游戏

import tkinter as tk
import tkinter.messagebox as tm
import random
# 设置窗口
window = tk.Tk()

# 设置窗口大小
window.geometry('500x300')
# 设置标题
window.title('猜字游戏')

'''
------------------- 数据 ------------------
'''
true_price = random.randint(100, 300)
print(true_price)
# 需要一个提交按钮对应的函数
def submit():
    global true_price
    # 获取输入框中的内容
    guss_price = int(input_price.get())
        # 判断输入的价格范围是否合法
    if 100 <= guss_price <= 300:
        # 进行对比
        if guss_price > true_price:
            info.set('猜的价格过大')
            price.set('***')
        elif guss_price < true_price:
            info.set('猜的价格过小')
            price.set('***')
        else:
            info.set('恭喜,商品带回家')
            # 显示真实价格
            price.set(f'真实价格:guss_price')
            box_msg = tm.askokcancel(title='提示',message='是否再开启一局?')
            if box_msg == True:
                # 把所有数据恢复到默认
                refresh_data()

    else:
        info.set('价格不在指定范围内')

def refresh_data():
    price.set('***')
    info.set('请输入商品的价格')
    # 修改全局的 true_price 生成新的价格
    true_price = random.randint(100, 300)
    print(true_price)
    # 清空输入框 len获取容器类型元素个数; first 从哪开始, last从哪结束
    # [first last)
    input_price.delete(first=0,last=len(input_price.get()))

'''
------------------- 界面 ------------------
'''

# 价格显示label
label = tk.Label(window, text='当前商品的价格是:', bg='pink',font=('楷体', 16))
# 显示在窗口上
label.place(x=30, y=20, width=250, height=30)

# 价格label
# 创建一个可变的字符串, 为标签添加内容 value 设置起始显示的值
price = tk.StringVar(value='***')
price_label = tk.Label(window, textvariable=price, bg='pink',font=('楷体', 16))
price_label.place(x=280, y=20, width=100, height=30)

# 价格输入的提示
input_label = tk.Label(window, text='请输入100-300商品价格', bg='pink',font=('楷体', 16))
# 显示在窗口上
input_label.place(x=30, y=60, width=250, height=30)

# 价格输入框
input_price = tk.Entry(window, show=None)
input_price.place(x=30, y= 100, width=250, height=30)

# 提交按钮
submit_btn = tk.Button(window, text='提交', bg='pink',font=('楷体', 16), command=submit)
submit_btn.place(x=280, y=100, width=100, height=30)

# 右下角的提示窗
tip_label = tk.Label(window, text='提示', bg='pink',font=('楷体', 16))
# 显示在窗口上
tip_label.place(x=280, y=180, width=210, height=30)

# 右下角的提示内容
info = tk.StringVar(value='请输入商品的价格')
content_label = tk.Label(window, textvariable=info, bg='pink',font=('楷体', 16))
# 显示在窗口上
content_label.place(x=280, y=210, width=210, height=60)

# 启动窗口
window.mainloop()

4.1 tkinter基本使用

练习: 猜数字游戏

5.搭建一个计算器

import tkinter as tk

# 设置窗口
window = tk.Tk()
# 设置窗口大小
window.geometry('300x600')
window.title('我的计算器')
'''
----------------- 按钮点击的操作 ----------------
'''
# 声明一个变量, 来累计按钮点击, 形成的计算式子
content = ''
# 设置一个未知项, 用于接收哪个按钮被点击了
def btn_click(data):
    global content
    # pass # 空白占位符
    # print(data)
    if data == 'Clear':
        # 清空操作
        expression.set('')
        result.set('')
        content = ''
    elif data == '=':
        result.set(f'eval(content)')
    else:
        # 其他的数据都要显示在计算的式子中
        content += data
        expression.set(content)


'''

----------------- 界面 -----------------
'''
# 显示公示和结果
expression = tk.StringVar()
result = tk.StringVar()
# 式子
formula_label = tk.Label(window, textvariable=expression, font=('楷体', 16), bg='pink')
formula_label.place(x=0, y=0, width=300, height=150)

# 结果 anchor 对齐方式
res_lebel = tk.Label(window, textvariable=result, font=('楷体', 16), bg='pink', anchor='e')
res_lebel.place(x=0, y=150, width=300, height=75)

# 列表 --- 用于包含按钮上的文本 -- 二维列表
'''
列表是一个有序的序列, 显示顺序与添加顺序是一致的
有序特点: 添加到序列中的元素会为其添加一个编号, 编号从0开始[下标, 角标, 索引]
在有序的序列中可以通过数据的编号定位到对应的数据
'''
btn_datas = [
    ['Clear', '(', ')', '+'],
    ['7', '8', '9', '-'],
    ['4', '5', '6', '*'],
    ['1', '2', '3', '/'],
    ['**', '0', '//', '=']
]
# 获取第二行的数据
print(btn_datas[1])
# 定位到*号
print(btn_datas[2][3])
# 按钮
for i in range(5): # 行
    for c in range(4): # 列
        btn = tk.Button(window,text=btn_datas[i][c], font=('楷体', 20), bg='pink', command=lambda x=btn_datas[i][c]: btn_click(x))
        btn.place(x=(75*c), y=225+i*75, width=75, height=75)

# 显示窗口
window.mainloop()

5.1 计算器搭建及逻辑处理

以上是关于Python3 - 函数以及GUI_TKINTER(第四天)的主要内容,如果未能解决你的问题,请参考以下文章

GUI_tkinter_界面控件及排版(入门)

Python3新特性 类型注解 以及 点点点

24response对象以及Python3中的一些变化

python3----函数匿名函数

python3 - 闭包

Python3---常见函数---open()