图形用户接口(GUI)

GUI编程基础

from tkinter import *


root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子



root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

from tkinter import *


root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

label = Label(root, text="Welcome to Python")  # label的text属性,显示一条文本信息内容

canvas = Canvas(root, bg="white")  # 画布可以显示各种文字图形信息

button = Button(root, text="Click me")  # 在主窗体里面添加一个按钮

# 创建完控件之后并不能直接在主窗体里面显示,需要对它进行布局器的管理
#pack默认是从上到下进行排列
label.pack()
canvas.pack()
button.pack()

root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

从左到右进行排列

from tkinter import *


root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

label = Label(root, text="Welcome to Python")  # label的text属性,显示一条文本信息内容

canvas = Canvas(root, bg="white")  # 画布可以显示各种文字图形信息

button = Button(root, text="Click me")  # 在主窗体里面添加一个按钮

# 创建完控件之后并不能直接在主窗体里面显示,需要对它进行布局器的管理
# pack默认是从上到下进行排列
label.pack(side=LEFT)
canvas.pack(side=LEFT)
button.pack(side=LEFT)

root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

布局管理器有三种,pack只是其中一种

GUI事件与事件处理

       事件(Events):当受控对象状态改变时,视窗操作系统给应用程序的通知或消息

       事件处理(Event handlers):捕获并响应事件的用户函数

       绑定或捆绑(bind): 建立事件与响应事件处理函数联系

事件就是像我们点击一个鼠标或者输入一些文本信息,操作系统给GUI程序发出的鼠标或者键盘消息

绑定就是将事件和事件处理关联在一起

事件有以下几种

pack是布局器,是用来显示控件的
创建完控件之后是不能再主窗体里面显示的,需要label.pack()才行

from tkinter import *

root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

label = Label(root, text="Welcome to python")
button1 = Button(root, text="relief")  # 控制label的边界
button2 = Button(root, text="color")  # 控制label的颜色

label.pack()
button1.pack(side=LEFT, anchor=CENTER, expand=YES)  # 自左向右排列,显示在中间,拓展占满整个空间
button2.pack(side=LEFT, anchor=CENTER, expand=YES)

root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

from tkinter import *

# 定义鼠标事件处理函数


def changeRelief():
    reliefList = ['flat', 'raised', 'sunken', 'groove', 'ridge']
    global reliefIndex
    label.config(relief=reliefList[reliefIndex % len(reliefList)])
    reliefIndex += 1


def changeColor(event):
    colorList = ['red', 'blue', 'yellow']
    global colorIndex
    label.config(fg=colorList[colorIndex % len(colorList)])
    colorIndex += 1


reliefIndex = 0
colorIndex = 0
root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

label = Label(root, text="Welcome to python")
button1 = Button(root, text="relief", command=changeRelief)  # 控制label的边界
button2 = Button(root, text="color")  # 控制label的颜色
button2.bind("<Button-1>", changeColor)  # 用bind方法来绑定的话要求函数必须有个参数

label.pack()
button1.pack(side=LEFT, anchor=CENTER, expand=YES)  # 自左向右排列,显示在中间,拓展占满整个空间
button2.pack(side=LEFT, anchor=CENTER, expand=YES)


root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

点击按钮可以改变内容的边框和颜色

键盘改变图形大小

from tkinter import *


def increaseRadius(event):
    global radius
    if radius < 100:
        radius += 2
    canvas.create_oval(100 - radius, 100 - radius,
                       100 + radius, 100 + radius, tags="oval")


def decreaseRadius(event):
    global radius
    if radius > 2:
        radius -= 2
    canvas.create_oval(100 - radius, 100 - radius,
                       100 + radius, 100 + radius, tags="oval")


root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

canvas = Canvas(root, bg='white', width=200, height=200)
canvas.bind("<Up>", increaseRadius)
canvas.bind("<Down>", decreaseRadius)
canvas.focus_set()  # 得到键盘事件的焦点

radius = 50
canvas.create_oval(100 - radius, 100 - radius,
                   100 + radius, 100 + radius, tags="oval")  # 指定左上角坐标和右下角坐标
canvas.pack()


root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

from tkinter import *


def increaseRadius(event):
    canvas.delete("oval")
    global radius
    if radius < 100:
        radius += 2
    canvas.create_oval(100 - radius, 100 - radius,
                       100 + radius, 100 + radius, tags="oval")


def decreaseRadius(event):
    canvas.delete("oval")
    global radius
    if radius > 2:
        radius -= 2
    canvas.create_oval(100 - radius, 100 - radius,
                       100 + radius, 100 + radius, tags="oval")


root = Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

canvas = Canvas(root, bg='white', width=200, height=200)
canvas.bind("<Up>", increaseRadius)
canvas.bind("<Down>", decreaseRadius)
canvas.focus_set()  # 得到键盘事件的焦点

radius = 50
canvas.create_oval(100 - radius, 100 - radius,
                   100 + radius, 100 + radius, tags="oval")  # 指定左上角坐标和右下角坐标
canvas.pack()


root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

消息弹窗

import tkinter.messagebox

tkinter.messagebox.showinfo('提示','请选择要隐藏信息的图像')

让用户选择文件路径

from tkinter import filedialog 

Fpath=filedialog.askopenfilename()

print(Fpath)

Fpath是字符串类型,存的就是选择的文件的路径

 

用坐标控制按钮的排列


import tkinter as tk
 
root = tk.Tk()  # 创建一个主窗体。相当于提供了一个搭积木的桌子

Button=tk.Button(root)
Button.place(height = 79,width = 66,x = 5,y = 87)

Button=tk.Button(root)
Button.place(height = 77,width = 73,x = 95,y = 84)

Button=tk.Button(root)
Button.place(height = 73,width = 86,x = 221,y = 84)

Button=tk.Button(root)
Button.place(height = 87,width = 54,x = 371,y = 82)

Button=tk.Button(root)
Button.place(height = 56,width = 58,x = 98,y = 191)

Button=tk.Button(root)
Button.place(height = 47,width = 77,x = 235,y = 196)

 
root.mainloop()  # 开启一个消息循环队列,可以持续不断地接受操作系统发过来的键盘鼠标事件,并作出相应的响应
# mainloop应该放在所有代码的最后一行,执行他之后图形界面才会显示并响应系统的各种事件

绘制直线

from tkinter import *
master = Tk()
w = Canvas(master, width=300,height=190)
w.pack()
w.create_line(200,30,200,150,
              fill='#C0C0C0',
              width=2,)
w.create_line(280,30,280,150,
              fill='#C0C0C0',
              width=2,)
w.create_line(200,30,280,30,
              fill='#C0C0C0',
              width=2,)
w.create_line(200,150,280,150,
              fill='#C0C0C0',
              width=2,)
mainloop()

设置窗口样式、透明和全屏

-toolwindow 可设置窗口为工具栏样式;
-alpha 可设置透明度,0完全透明,1不透明。这里透明是窗口内的所有内容,不仅是窗体,所以要特别小心一个完全透明的窗口!
-fullscreen 设置全屏 注意前面的短横杠(-) 不能少
-topmost 设置窗口置顶。两个同时被置顶的窗口为同级(能互相遮盖),但他们都能同时遮盖住没有被设置为置顶的窗口。
 

root.attributes('-toolwindow', False, 
                '-alpha', 0.9, 
                '-fullscreen', True, 
                '-topmost', True)

Tkinter布局管理

Tkinter有三种布局管理方式:

  • pack
  • grid
  • place

这三种布局管理在同一个 master window 里是不可以混用的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐