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()
无边框
只需要加入下面一行代码。
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》