Python 基于tkinter的GUI编程

tkinter是Python的标准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个核心的窗口部件。

Frame():创建控件容器,可依附在窗口中
TopLevel():创建弹出式窗口

Tkinter类 控件名称 说明
Frame 框架 用来承载放置其他GUI元素,就是一个容器
Label 标签 在指定的窗口中显示不可编辑的文本或图像
Button 按钮 在程序中显示按钮,能够包含文本或图像

共同属性:

  1. anchor:定义控件在窗口内的位置或者文字信息在控件内的位置
  2. background(bg):定义控件的背景颜色

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

Label控件(标签)

语法格式如下:

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

常用的options:

bg:标签背景颜色;
text:设置文本,可以包含换行符(\n);
font:设置字体;
image:设置标签图像。

示例代码 (文本显示)

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

运行结果:
Python 基于tkinter的GUI编程

示例代码 (图像显示)

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

运行结果:

Python 基于tkinter的GUI编程

在用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自动调用相关联的函数或方法。

语法格式如下:

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

运行结果:
Python 基于tkinter的GUI编程

几何管理

窗口控件的三种放置方式

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

后续更新~

上一篇:cookie详解


下一篇:浏览器相关面试题