【Python GUI篇】Python 基于tkinter的GUI编程

tkinter 是 Python 的标准 GUI 库(“Tk 接口”)。Python 使用 tkinter 可以快速的创建 GUI 应用程序。

由于 tkinter 是内置到 python 的安装包中,只要安装好 Python 之后就能 import tkinter 库。而且 IDLE 也是用 tkinter 编写而成,对于简单的图形界面 tkinter 还是能应付自如。

加载tkinter模块

import tkinter
inport tkinter as tk
from tkinter import *

三者的区别在于:第二种加载方式相当于给tkinter重命名;第三种加载方式是加载tkinter模块的所有属性,如此可以直接使用tkinter模块的属性名称。

import tkinter
win=tkinter.Tk()                 #创建主窗口
import tkinter as tk
win=tk.Tk()                      #创建主窗口
from tkinter import *
win=Tk()                         #创建主窗口

Tk():创建应用程序主窗口

from tkinter import *
win = Tk()  #创建主窗口

实例代码分析:

  1. 第一行:加载tkinter库
  2. 第二行:使用tkinter模块的Tk()方法创建一个主窗口,win是此窗口的句柄。如果用户调用多次Tk()方法,就可以创建多个主窗口。

上述程序创建的窗口是非常简单的,有待进一步完善,即设置标题、窗口大小、背景颜色、窗口是否可变等,具体可参考如下说明:

设置窗口标题

win.title('My window')

自定义窗口的大小和位置

win.geometry('500x300')  # 这里的乘是小写x,(长x宽),单位是像素

width, height = 500, 300
place_x, place_y = 100, 100 #位置以屏幕左上角为起始点(0,0)
win.geometry(f'{width}x{height}+{place_x}+{place_y}')  
# win.geometry('500x300+100+100')

设置窗口背景颜色

win.config(bg='black')

隐藏窗口外部

win.overrideredirect(True)

固定窗口尺寸

win.resizable(0, 0)
# 或者也可以写成这样:
win.resizable(False, False)
#设置窗口是否可变长、宽,True:可变,False:不可变
win.resizable(width=False, height=True)

设置窗口最小|最大尺寸

win.minsize(width,height) #最小尺寸
win.maxsize(width,height) #最大尺寸

窗口创建4秒后关闭窗口

win.after(4000, win.destroy)
after() 函数的使用格式:win.after(time, function)
time 为窗口创建后等待的时间,单位为毫秒(4000 毫秒 即 4 秒)
function 可以是已经定义的函数(后面不能加括号),也可以是 lambda 表达式

主窗口循环显示

win.mainloop()
注意,loop因为是循环的意思,win.mainloop就会让win不断的刷新
如果没有mainloop,就是一个静态的win,传入进去的值就不会有循环
mainloop相当于while循环,while True,每点击一次就会更新一次,所以我们必须要有循环
所有的窗口文件都必须有类似的mainloop函数,mainloop是窗口文件的关键的关键。

若要求:设置主窗口位于屏幕居中

from tkinter import *

#初始化Tk()
win = Tk()

#设置标题
win.title('Python GUI Learning')

#设置窗口大小
width = 380
height = 300

#获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
screenwidth = win.winfo_screenwidth()
screenheight = win.winfo_screenheight()

#放置窗口
str= '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
win.geometry(str)

tkinter控件(组件、窗口部件)

以下内容部分参考整理自博客:
https://www.cnblogs.com/shwee/p/9427975.html#D15

仅有窗口并不能实现交互,还需要控件,Tkinter 提供了各种控件,在一个 GUI 应用程序中使用,这些控件通常被称为组件或者部件。Tkinter支持16个核心的窗口部件。

Tkinter类控件名称说明
Label标签在指定的窗口中显示不可编辑的文本或图像
Button按钮在程序中显示按钮,能够包含文本或图像
Entry输入输入显示一行文本
Text文本显示和处理多行文本
Scale尺度
共同属性:
  1. anchor:定义控件在窗口内的位置或者文字信息在控件内的位置
  2. background(bg):定义控件的背景颜色

控件中的参数是关键字参数,其由键-值组成。
关键字参数在传递过程中不必按照顺序传递,提供”传递参数名=传递参数值”形式的参数。

tkinter模块常用参数(python3)

https://www.cnblogs.com/aland-1415/p/6849193.html

Label控件(标签)

语法格式如下:

w = Label ( master, option, ... )
#master: 框架的父容器。
#options: 可选项,即该标签的可设置的属性。这些选项可以用键-值的形式设置,并以逗号分隔。

常用的options:

bg:标签背景颜色;
text:设置文本,可以包含换行符(\n);
font:设置字体;
image:设置标签图像。
参考:
https://blog.csdn.net/ever_peng/article/details/107235427

示例代码 (文本显示)
import tkinter as tk  
 
#实例化object,建立窗口window
window = tk.Tk()
 
window.title('My Window')
window.geometry('500x300')
 
#在窗口中设定标签
label= tk.Label(window, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
# 说明: bg为背景,font为字体,width为长,height为高,这里的长和高是字符的长和高,比如height=2,就是标签有2个字符这么高
 
#放置标签
label.pack()
# Label内容content区域放置位置,自动调节尺寸
# 放置lable的方法有:1)label.pack(); 2)label.place();
 
#主窗口循环显示
window.mainloop()

运行结果:
在这里插入图片描述

示例代码 (图像显示)
import tkinter as tk  
 
#实例化object,建立窗口window
window = tk.Tk()
 
window.title('My Window')
window.geometry('500x300')
 
#导入图片
photo=tk.PhotoImage(file='c.gif')

#在窗口中设定标签
PhotoLabel=tk.Label(window, image=photo)

#放置标签
PhotoLabel.pack()

 
#主窗口循环显示
window.mainloop()

运行结果:

在这里插入图片描述

在用Label控件显示图像时需要注意:

  1. tkinter只能装入gif图片,也就是扩展名是.gif的图片文件。因为tkinter.PhotoImage()仅支持 GIF。否则会报错,类似于:_tkinter.TclError: couldn’t recognize data in image file “xxx.jpg”。
  2. 导入后的gif图是静态图像。
  3. 单独使用 PhotoImage 函数时,会出现以下问题:
import tkinter as tk
photo = tk.PhotoImage(file='c.gif')

RuntimeError: Too early to create image: no default root window

参考了这位博主的answer:
google到的解决方法:
You forgot to declare root - root = Tk().The Tk system must be ON before using it.
即使用PhotoImage()前应该声明一个Tk(Toplevel也是可以的)
版权声明:本文为CSDN博主「John__wang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/John__wang/article/details/22325881

Button控件(按钮)

Button(按钮)部件是一个标准的tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图像,并且能够将按钮与一个Python函数或方法相关联。按钮可用于监听用户行为,当按钮被按下时,Tkinter自动调用相关联的函数或方法。

没有回调函数的按钮是没有用的,当你按下这个按钮时它什么也不做。
b = tk.Button(window, text=“Help”, command=DISABLED)

语法格式如下:

w = Button ( master, option=value, ... )
#master: 按钮的父容器。
#options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。

常用的options:

bg:按钮背景颜色;
text:设置文本;
font:设置字体,按钮仅能显示一种字体;
command:按钮关联的函数,当按钮被点击时,执行该函数;
padx:按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离;
pady:按钮在y轴方向上的内边距(padding)

示例代码:

from tkinter import *
win = Tk()
#文字与边框水平距离为20像素
Button(win, padx=20, text="关闭", command=win.quit).pack()
#b=Button(win, padx=20, text="关闭", command=win.quit)
#b.pack()
win.mainloop()

Entry控件(输入)

Entry是tkinter类中提供的的一个单行文本字符串输入域,用来输入显示一行文本,采集键盘输入。
注:
如果需要输入多行文本,可以使用 Text 组件。
如果需要显示一行或多行文本且不允许用户修改,可以使用 Label 组件。

语法格式如下:

w = Entry( master, option, ... )
master: 按钮的父容器。
options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。

常用的options:

bg:输入框背景颜色;
font:设置字体;
cursor:光标的形状设定,如arrow, circle, cross, plus 等;
show:指定文本框内容显示为字符,值随意,满足字符即可。如密码可以将值设为 show=“*”;

示例代码:

import tkinter as tk
 
# 实例化object,建立窗口window
window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小写x
 
# 在图形界面上设定输入框控件entry并放置
e1 = tk.Entry(window, show='*', font=('Arial', 14))   # 显示成密文形式
e2 = tk.Entry(window, show=None, font=('Arial', 14))  # 显示成明文形式
e1.pack()
e2.pack()
 
# 主窗口循环显示
window.mainloop()

Text控件(文本)

Text文本组件用于显示和处理多行文本,采集用户输入的字符,格式化文本显示,同时支持内嵌图象和窗口。
当创建一个Text组件的时候里面是没有内容的。为了给其插入内容,可以使用insert()。
在程序运行后显示的文本框中也可以通过键盘输入新的文本。

示例代码:

import tkinter as tk

window = tk.Tk()
window.title('My Window')
window.geometry('500x300') 
 
# 在图形界面上设定输入框控件entry框并放置
e = tk.Entry(window, show = None)  #显示成明文形式
e.pack()
 
# 定义两个触发事件时的函数insert_point和insert_end
#注意:因为Python的执行顺序是从上往下,所以函数一定要放在按钮的上面

##INSERT索引表示在光标处插入
def insert_point(): # 在鼠标焦点处插入输入内容
    var = e.get()
    t.insert('insert', var)
#END索引号表示在最后插入
def insert_end():   # 在文本框内容最后接着插入输入内容
    var = e.get()
    t.insert('end', var)
 
# 创建并放置两个按钮分别触发两种情况
b1 = tk.Button(window, text='insert point', width=10,
               height=2, command=insert_point)
b1.pack()
b2 = tk.Button(window, text='insert end', width=10,
               height=2, command=insert_end)
b2.pack()
 
# 创建并放置一个多行文本框text用以显示,指定height=3为文本框是三个字符高度
t = tk.Text(window, height=3)
t.pack()
 
# 主窗口循环显示
window.mainloop()

该程序的作用是将输入框的内容读取到文本框中(使用insert()函数)。

关于文本控件的属性这篇文章写的蛮浅显直白:
版权声明:本文为CSDN博主「风华明远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/weixin_42272768/article/details/100725243

还有个更简单的:

from tkinter import *

root = Tk()

text1 = Text(root,width=30,height=2)
text1.pack()
text1.insert(INSERT,'I love you')

def show():
     print('吆喝,我被点了一下')
#text还可以插入按钮  图片等
b1 = Button(text1,text='点我点我',command=show)

#在text创建组件的命令
text1.window_create(INSERT,window=b1)

mainloop()

运行结果:
在这里插入图片描述

Frame控件(框架)

Frame(框架)组件是在屏幕上的一个矩形区域。Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充。
Frame:框架,用来承载放置其他GUI元素,就是一个容器,是一个在窗口上分离小区域的部件, 它能将窗口分成不同的区,存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame。
常用的options:

参考:
https://blog.csdn.net/qq_44168690/article/details/104858865?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

示例代码:

from tkinter import *


root = Tk()
root.geometry("520x220+200+100")

f1 = Frame(root)
f1.pack()
f2 = Frame(root)
f2.pack()

btnText = ("流行风", "中国风", "日本风", "金属风", "轻音乐")

for txt in btnText:
    Button(f1, text=txt).pack(side="left", padx="10")

for i in  range(1, 12):
    Label(f2, width=5, height=10, borderwidth=1, relief="solid",
          bg="black" if i % 2 ==0 else "white").pack(side="left", padx=2)


root.mainloop()

运行结果:
在这里插入图片描述

Listbox控件

Listbox是tkinter中提供的的列表框部件,显示供选方案的一个列表。

与Listbox相关的命令函数:
https://blog.csdn.net/xoofly/article/details/89684661

示例代码:

import tkinter as tk

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#在图形界面上创建一个标签label用以显示并放置
tk.Label(window,text='单选:选择你最喜欢玩的').pack()
var1 = tk.StringVar()  # 创建变量,var1采集鼠标选中选项的内容
l=tk.Label(window, bg='black', fg='white',font=('Arial', 12), width=10, textvariable=var1)
l.pack()
 
#创建按钮的点击事件
def print_selection():
    value = lb.get(lb.curselection())   # 获取当前选中的文本(lb=Listbox)
    var1.set(value)  # 为label设置值
 
#创建按钮并放置,点击按钮调用print_selection函数
b1 = tk.Button(window, text='print selection', width=15, height=2, command=print_selection)
b1.pack()
 
#创建Listbox并为其添加内容
var2 = tk.StringVar()
var2.set(('明日方舟','王者荣耀','绝地求生','漂亮姐姐')) # 为变量var2设置值

#创建Listbox
lb=tk.Listbox(window, listvariable=var2)  #将var2的值赋给Listbox

#创建一个list列表并将值添加到Listbox控件中
list_items = ['Python','C','Java','HTML']
for item in list_items:
    lb.insert('end', item)  # 从最后一个位置开始加入值
lb.insert(0, '游戏')       # 在第一个位置加入'游戏'字符
lb.insert(5, '敲代码')      # 在第五个位置加入'敲代码'字符
#lb.delete(5)                # 删除第五个位置的字符
lb.pack()
 
# 第8步,主窗口循环显示
window.mainloop()

运行结果:
在这里插入图片描述

Scale控件(尺度)

Scale: 尺度(拉动条),允许通过滑块来设置一值。

示例代码:

import tkinter as tk
 
window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#创建一个标签label用以显示并放置
l=tk.Label(window, bg='black', fg='white', width=20, text='empty')
l.pack()
 
#定义一个触发函数
def print_selection(v):
    l.config(text='you have selected ' + v)
#创建一个尺度滑条
#长度200字符,从0开始10结束,以2为刻度,精度为0.01
#触发调用print_selection函数
s=tk.Scale(window, label='try me', from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=0,tickinterval=2, resolution=0.01, command=print_selection)
s.pack()
 
#主窗口循环显示
window.mainloop()

运行结果:
在这里插入图片描述

Menu控件(菜单)

用来实现下拉和弹出式菜单,点下菜单后弹出的一个选项列表,用户可以从中选择

MessageBox控件(弹窗)

tkinter.messagebox.showinfo(title='Hi', message='你好!')            # 提示信息对话窗
tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告对话窗
tkinter.messagebox.showerror(title='Hi', message='出错了!')         # 提出错误对话窗
print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 询问选择对话窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'

示例代码:

import tkinter as tk
import tkinter.messagebox
#要使用messagebox先要导入模块
 

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#定义触发函数功能
def hit_me():
    tkinter.messagebox.showinfo(title='Hi', message='你好!')              # 提示信息对话窗
    # tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告对话窗
    # tkinter.messagebox.showerror(title='Hi', message='出错了!')         # 提出错误对话窗
    # print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 询问选择对话窗return 'yes', 'no'
    # print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
    # print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'
 
#创建一个按钮用以显示内容并放置
tk.Button(window, text='hit me', bg='green', font=('Arial', 14), command=hit_me).pack()
 
#主窗口循环显示
window.mainloop()

几何管理

窗口控件的三种放置方式

http://www.tianqiweiqi.com/python-tkinter-place-pack-grid.html
这个写得很不错喔

几何方法描述
pack()
grid()
place()

pack()

import tkinter as tk
 
window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#pack放置方法
tk.Label(window, text='N', fg='red').pack(side='top')    # 上
tk.Label(window, text='S', fg='red').pack(side='bottom') # 下
tk.Label(window, text='W', fg='red').pack(side='left')   # 左
tk.Label(window, text='E', fg='red').pack(side='right')  # 右

window.mainloop()

grid()

import tkinter as tk

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#grid放置方法
for i in range(3):
    for j in range(3):
        l=tk.Label(window, text=1)
        l.grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)
 
# 第5步,主窗口循环显示
window.mainloop()

以上的代码就是创建一个三行三列的表格,其实 grid 就是用表格定义的。
参数 row 为行,colum 为列,padx 是单元格左右间距,pady 就是单元格上下间距,ipadx是单元格内部元素与单元格的左右间距,ipady是单元格内部元素与单元格的上下间距。

place()

给精确的坐标来定位

import tkinter as tk

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')  # 这里的乘是小x
 
#place放置方法(精准的放置到指定坐标点的位置上)
l=tk.Label(window, text='漂亮姐姐', font=('Arial', 20))
l.place(x=50, y=100)
 
#主窗口循环显示
window.mainloop()

后续更新~

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值