Tkinter是Python附带的标准GUI工具包。它易于使用,但支持的部件较少。其他的比较有名的GUI工具包有wxPytohn,PyQt,PyGTK。下面总结了一些常用的GUI效果的实现方式。
Splash
Splash就是程序启动界面(主界面显示前的界面),比如手机APP打开后显示的LOGO画面(大多是广告),splash通常可用来放品牌logo或公司信息。
# import Tkinter
def splash():
root = Tkinter.Tk()
root.overrideredirect(True)
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry('%dx%d+%d+%d' % (width*0.8, height*0.8,
width*0.1, height*0.1))
# 保存成gif格式。(但是没法显示动图,待解决。)
image_file = "hi.gif"
#assert os.path.exists(image_file)
# use Tkinter's PhotoImage for .gif files
image = Tkinter.PhotoImage(file=image_file)
canvas = Tkinter.Canvas(root, height=height*0.8,
width=width*0.8, bg="white")
canvas.create_image(width*0.8/2, height*0.8/2, image=image)
canvas.pack()
# 设置splash显示的时间,单位是毫秒(milliseconds)
root.after(4000, root.destroy)
root.mainloop()
在主程序启动前调用splash()
某软件的启动界面(splash)
无边框
只需要加入下面一行代码。
root.overrideredirect(True)
某个简陋的无边框软件……
多标签面板
首先定义一个类,建议把它保存成单独的文件,然后把它放在系统环境变量里,这样可以方便调用。
from Tkinter import *
class Notebook(object):
def __init__(self, master, side=LEFT):
self.active_fr = None
self.count = 0
self.choice = IntVar(0)
if side in (TOP, BOTTOM): self.side = LEFT
else: self.side = TOP
self.rb_fr = Frame(master, borderwidth=2, relief=RIDGE)
self.rb_fr.pack(side=side, fill=BOTH)
self.screen_fr = Frame(master, borderwidth=2, relief=RIDGE)
self.screen_fr.pack(fill=BOTH)
def __call__(self):
return self.screen_fr
def add_screen(self, fr, title):
b = Radiobutton(self.rb_fr, text=title, indicatoron=0,
variable=self.choice, value=self.count,
command=lambda: self.display(fr))
b.pack(fill=BOTH, side=self.side)
if not self.active_fr:
fr.pack(fill=BOTH, expand=1)
self.active_fr = fr
self.count += 1
def display(self, fr):
self.active_fr.forget()
fr.pack(fill=BOTH, expand=1)
self.active_fr = fr
下面是一个示例:
from Tkinter import *
from notebook import * # 如果notebook类在同一个文件就省去这行
# 生成一个顶层窗口,放入notebook
root = Tk()
root.geometry("400x400+500+300")
nb = Notebook(root, TOP) # 标签的位置可选:LEFT、TOP
# 每一个框架(Frame)代表一个标签面板
f1 = Frame(nb())
b1 = Button(f1, text="Button 1")
e1 = Entry(f1)
b1.pack(fill=BOTH, expand=1)
e1.pack(fill=BOTH, expand=1)
# 在将框架添加到记事本之前,先把部件放进去
# 不要单独放入框架
f2 = Frame(nb())
b2 = Button(f2, text="Button 2")
iconImage = Tkinter.PhotoImage(master=f2, data=icon)
Tkinter.Button(image=iconImage).pack()
b3 = Button(f2, image=iconImage)
b2.pack(fill=BOTH, expand=1)
b3.pack(fill=BOTH, expand=1)
f3 = Frame(nb())
lb1 = Label(f3, text="欢迎来到标签3...")
lb1.pack()
# 添加标签面板和面板名称
nb.add_screen(f1, "标签 1")
nb.add_screen(f2, "标签 2")
nb.add_screen(f3, "标签 3")
root.mainloop()
新手备注
在Python中使用文件时要把文件的完整路径写出来。或者在调用前使用os模块的chdir函数。
import os
os.chdir("C:\photos\")
os.chdir(os.getcwd()) # better
如果要发布给别人用,那就使用相对路径。使用下面这个函数包裹你要使用的文件路径(相对于程序根目录的路径),这样即使你换了文件夹,文件还是会得到正确的调用。
import os
import sys
def resource_path(relative_path):
"""
定义一个读取相对路径的函数
1、引用文件用如下格式:resource_path('resources/complete.wav')
你只需要填入相对于程序根目录的文件路径。
2、打包exe的说明:在生成的.spec文件exe = EXE()中加入下面这行:
[('resources/complete.wav',r'C:\Users\Administrator\resources\complete.wav','music'),],
列表中的三项分别为代码中的引用,文件实际的地址,类别
这样打包后文件会被正确引用。
"""
if hasattr(sys, "_MEIPASS"):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
注:标签面板的代码来自《Python Cookbook》