Tkinter效果总结

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效果

某软件的启动界面(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》

撰写评论

电子邮件地址不会被公开,必填项已用 * 标出。