tkinter
- Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .
- Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
创建一个GUI程序
- 1、导入 Tkinter 模块
- 2、创建控件
- 3、指定这个控件的 master, 即这个控件属于哪一个
- 4、告诉 GM(geometry manager) 有一个控件产生
import tkinter
win=tkinter.Tk()
# 进入消息循环
win.mainloop()
添加功能
- Tkinter 组件:
- Button 按钮;
Canvas 绘图形组件,可以在其中绘制图形;
Checkbutton 复选框;
Entry 文本框(单行);
Text 文本框(多行);
Frame 框架,将几个组件组成一组
Label 标签,可以显示文字或图片;
Listbox 列表框;
Menu 菜单;
Menubutton 它的功能完全可以使用Menu替代;
Message 与Label组件类似,但是可以根据自身大小将文本换行;
Radiobutton 单选框;
Scale 滑块;允许通过滑块来设置一数字值
Scrollbar 滚动条;配合使用canvas, entry, listbox, and text窗口部件的标准滚动条;
Toplevel 用来创建子窗口窗口组件。 (在Tkinter中窗口部件类没有分级;所有的窗口部件类在树中都是兄弟。)
- 标准属性
- 属性 描述
Dimension 控件大小;
Color 控件颜色;
Font 控件字体;
Anchor 锚点;
Relief 控件样式;
Bitmap 位图;
Cursor 光标;
- 几何管理
- 几何方法 描述
pack() 包装;
grid() 网格;
place() 位置;
做了两个小程序:
小学生计算器(熟悉Button)
"""
小计算器练习Tkinter的属性和方法
学会使用按钮button
实现计算功能
解决被减数为负数的计算问题,除0问题
有一个问题没有解决:我想叫“=”加宽使按钮面板漂亮,但是他不能占两个锚位,已解决
"""
from tkinter import *
root = Tk()
# 定义面板的大小
root.geometry('250x320')
root.title("小学生计算器")
# 定义面板
# bg代表背景颜色(background), #dddddd是十六进制表示颜色的一个串
frame_show = Frame(width=300, height=150, bg='#ffd700')#金色
frame_show.pack()
# 定义顶部区域
sv = StringVar()
sv.set('0')
# anchor:定义控件的锚点,e代表右边
# font代表字体
show_label = Label(frame_show, textvariable=sv, \
bg='green', width=12, height=1,\
font=("黑体", 20, 'bold'),\
justify=LEFT, anchor='e')
show_label.pack(padx=10, pady=10)
# 函数部分
num1 = ''
num2 = ''
operator = ''
def delete():
global num1,num2
len_num = len(num1)
num = num1[0:(len_num-1)]
sv.set(num)
num1 = num
return num1
def clear():
global num1,num2
num1 = ''
num2 = ''
operator = ''
sv.set("0")
def change(num):
global num1,num2
num1 = num1+num
sv.set(num1)
# print(num1)
def operation(op):
global operator
if op in ['+', '-', 'x', '/']:
operator = op
change(op)
# print(op)
else:
pass
def judge():
global num1,num2,operator
if operator =="/":
z,x = map(float,num1.split("/"))
if x == 0:
sv.set("除数不能为0")
else:
result()
# elif ("+"or"-"or"x"or"/")not in num1 :
# sv.set(num1)
else:
result()
def result():
# print("=")
global num1,num2,operator
if operator == "+":
num1,num2 = map(float,num1.split("+"))
rst = num1 + num2
elif operator == "-":
if num1[0]== "-":
num1 = num1[1:len(num1)]
num1,num2 = map(float,num1.split("-"))
rst = 0 - num1 - num2
else:
num1,num2 = map(float,num1.split("-"))
rst = num1 - num2
elif operator == "x":
num1,num2 = map(float,num1.split("x"))
rst = num1 * num2
elif operator == "/":
num1,num2 = map(float,num1.split("/"))
rst = num1 / num2
else:
pass
rst = str(rst)
rst1,rst2 = map(int,rst.split("."))
if rst2 == 0:
rst = rst1
else:
rst = float(rst)
rst = round(rst,(12-1-len(str(rst1))))
num1 = str(rst)
sv.set(num1)
# 按键区域
frame_bord = Frame(width=400, height=350, bg='#cccccc')#
b_del = Button(frame_bord, text="←", width=5, height=2,command=delete)
b_del.grid(row=0, column=0)
b_clear = Button(frame_bord,text = 'C',width = 5,height =2,command = clear)
b_clear.grid(row = 0,column = 1)
b_jia = Button(frame_bord, text='+', width=5, height=5,command=lambda:operation("+"))
b_jia.grid(row=2, column=3,rowspan= 2)
b_jian = Button(frame_bord, text='-', width=5, height=2,command=lambda:operation("-"))
b_jian.grid(row=1, column=3)
b_cheng = Button(frame_bord, text='x', width=5, height=2,command=lambda:operation("x"))
b_cheng.grid(row=0, column=2)
b_chu = Button(frame_bord, text='/', width=5, height=2,command=lambda:operation("/"))
b_chu.grid(row=0, column=3)
b_dengyu = Button(frame_bord,text='=', width=12, height=2,command=judge)
b_dengyu.grid(row=4, column=2,columnspan=2)
# b_1 = Button(frame_bord, text='1', width=5, height=2,command=change("1"))
b_1 = Button(frame_bord, text='1', width=5, height=2,command=lambda:change("1"))
b_1.grid(row=1, column=0)
b_2 = Button(frame_bord, text='2', width=5, height=2,command=lambda:change("2"))
b_2.grid(row=1, column=1)
b_3 = Button(frame_bord, text='3', width=5, height=2,command=lambda:change("3"))
b_3.grid(row=1, column=2)
b_4 = Button(frame_bord, text='4', width=5, height=2,command=lambda:change("4"))
b_4.grid(row=2, column=0)
b_5 = Button(frame_bord, text='5', width=5, height=2,command=lambda:change("5"))
b_5.grid(row=2, column=1)
b_6 = Button(frame_bord, text='6', width=5, height=2,command=lambda:change("6"))
b_6.grid(row=2, column=2)
b_7 = Button(frame_bord, text='7', width=5, height=2,command=lambda:change("7"))
b_7.grid(row=3, column=0)
b_8 = Button(frame_bord, text='8', width=5, height=2,command=lambda:change("8"))
b_8.grid(row=3, column=1)
b_9 = Button(frame_bord, text='9', width=5, height=2,command=lambda:change("9"))
b_9.grid(row=3, column=2)
b_0 = Button(frame_bord, text='0', width=5, height=2,command=lambda:change("0"))
b_0.grid(row=4, column=0)
b_piont = Button(frame_bord, text='.', width=5, height=2,command=lambda:change("."))
b_piont.grid(row=4, column=1)
frame_bord.pack(padx=10, pady=10)
root.mainloop()
不断修改后运行还不错
画围棋盘(熟悉Canvas)
import tkinter
win=tkinter.Tk()
win.title("围棋盘")
#设变量是为了调整棋盘大小,但是程序可读性差
start_w = 200 #棋盘的起始位置X轴
start_h = 100
w = 27 #格的宽度
h = 30
global w,h,start_w,start_h
can = tkinter.Canvas(win,width=1000,height=1200,bg= ("#ADFF2F"))
for i in range(19):
can.create_line((start_w,(start_h+i*h)),((start_w+18*w),(start_h+i*h)),width=2)#横
can.create_line(((start_w+i*w),start_h),((start_w+i*w),(start_h+18*h)),width=2)#竖
for i in range(3):
for j in range(3):
can.create_oval((((start_w+3*w)+6*w*i)-1,((start_h+3*h)+6*h*j)-1),\
(((start_w+3*w)+6*w*i)-1,((start_h+3*h)+6*h*j)-1),width=8) #坐标都减1,校正圆点位置
#画边框为了美观
can.create_line((start_w-5,start_h-5),(start_w+5+18*w,start_h-5),width=2)
can.create_line((start_w-5,start_h+5+18*h),(start_w+5+18*w,start_h+5+18*h),width=2)
can.create_line((start_w-5,start_h-5),(start_w-5,start_h+5+18*h),width=2)
can.create_line((start_w+5+18*w,start_h-5),(start_w+5+18*w,start_h+5+18*h),width=2)
can.pack()
win.mainloop()
棋盘美观大方