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()

棋盘美观大方