用Tkinter打造GUI开发工具(23)软件窗口皮肤

@用Tkinter打造GUI开发工具(23)软件窗口皮肤

用Tkinter打造GUI开发工具(23)软件窗口皮肤

Tkinter 是 Python 的标准 GUI 库,它是一个跨平台的脚本图形界面接口(GUI)程序,且可以快速的创建 GUI 应用程序。Tkinter库是一个跨平台的窗口应用程序,使用它设计的程序可以在Windows、Mac、Linux系统上执行。由于 Tkinter 是内置到 Python 的安装包中,只要安装好 Python 之后就能导入Tkinter 库,而且Python自带编辑器IDLE 也是用 Tkinter 编写而成。Tkinter能够开发各种应用程序窗口界面。一些常见的库,例如Turtle库,EasyGui库都是建立在Tkinter库的基础上。用户可以轻松运用复制、粘贴、修改等方式,快速搭建用户自己的GUI程序界面。
很多朋友认为Tkinter做的软件很丑,这都是误解.因为这些朋友不会Tkinter. 我们这节介绍Tkinter的美化设计.
首先看看我用Tkinter开发的软件界面,这个界面有背景音乐。
在这里插入图片描述
相关代码如下,中间弹出窗口的文字都是程序生成的.

g.root = tk.Tk()
pygame.mixer.init()
musicfile='mus/1.mid'  #背景音乐名
pygame.mixer.music.load(musicfile)  #加载背景音乐文件
pygame.mixer.music.set_volume(0.4)  #设置背景音量
pygame.mixer.music.play(loops=2)   #播放一次
g.root.title(g.title) 
window1 = tk.IntVar(g.root, value=0)
pil_image =Image.open('img//bj.jpg')
#获取图像的原始大小  
w, h = pil_image.size  
w2=w+1
h2=h+10        
pil_image = resize(w, h, w2 , h2, pil_image)  
r2,g2,b2=RGB(g.cns['gold'])
drawFont2(pil_image,10,10,"小白量化框架聚宽专版",size=40,r=r2,g=g2,b=b2)
r2,g2,b2==RGB(g.cns['gold'])
drawFont2(pil_image,80,50,"--大众化基于人工智能的量化投资系统",size=26,r=r2,g=g2,b=b2)
drawFont3(pil_image,10,70,"超越!",size=80,r=255,g=0,b=0)
drawFont3(pil_image,110,140,"是我们的每一步!",size=54,r=255,g=255,b=0)
tk_image = ImageTk.PhotoImage(pil_image)  
username = tk.StringVar()  
password = tk.StringVar()  

def loginCheck():  
    name = username.get()  
    secret =password.get()  
    try:
        x=auth(name,secret)  #用户登录,name是用户名,secret是用户密码
    except:
        x="error"
    if x!='error' or x=='' :
        g.login=True
        pygame.mixer.music.stop()  #停止背景音乐
        pygame.mixer.quit() #退出音乐mixer模块
        g.status.set(5,'登录')  #格式输出信息
        g.status.text(1,'') #在状态栏2输出信息
        w1.destroy()
    else:  
        g.status.text(2,'账号或密码错误!') #在状态栏2输出信18578息            
        showinfo(title='错误', message='账号或密码错误!')
        g.login=False

def rtnkey(self,event=None):
    loginCheck()

w1 = myWindow(g.root,g.title,w2,h2)  #创建弹出窗口
showIco(w1.top,g.ico)  #设置窗口图标
w1.overturn() #隐藏窗口边框
label=tk.Label(w1.top,image=tk_image)
label.place(x=0, y=0, relwidth=1, relheight=1,bordermode=tk.OUTSIDE)
    Label(w1.top, text = '聚宽账户: ',font = 'Helvetica -18 bold',bg=g.cns['gold']).place(x=90, y=210)
Entry(w1.top, textvariable=username,font = 'Helvetica -18 bold').place(x=210, y=210)
username.set(g.user) 
Label(w1.top, text = '聚宽密码: ',font = 'Helvetica -18 bold',bg=g.cns['gold']).place(x=90, y=250)
pas=Entry(w1.top, textvariable=password, show='*',font = 'Helvetica -18 bold')
pas.place(x=210, y=250)
pas.bind('<Key-Return>', rtnkey)   
Button(w1.top, text='登  陆', command=loginCheck,font = 'Helvetica -18 bold',bg=g.cns['gold'],fg='blue').place(x=90, y=290)
Button(w1.top, text='退  出', command=w1.destroy,font = 'Helvetica -18 bold',bg=g.cns['gold'],fg='blue').place(x=350, y=290)
setCenter(w1.top,tk_image.width()+4,tk_image.height()+4)
reSizable(w1.top,False, False)
robot_init()
MainPagejq(g.root)  

完整代码见《零基础搭建量化投资系统――以Python为工具》一书提供的完整示例。
该书在京东、淘宝、当当网上销售,欢迎大家订购正版书。
在这里插入图片描述
《零基础搭建量化投资系统――以Python为工具》第8章目录

第8章 视窗程序开发模块Tkinter
    8.1 Tkinter的使用
    8.2 小部件的标准属性
	8.2.1 Tkinter控件的属性
	8.2.2 Tkinter控件属性的值和单位
 	    1. 维度单位
 	    2. 座标系统
 	    3. 颜色
 	    4. 字体类型
 	    5. 对齐方式
 	    6. 浮雕风格
 	    7. 位图
 	    8. 鼠标样式
 	    9. 图片
    8.3 Tkinter主窗口
    8.4 Toplevel顶层子窗口
    8.5 创建窗口菜单
    8.6 创建弹出菜单
    8.7 控件的几何布局管理方法
        1. 控件的pack布局
        2. 控件的grid布局
	3. 控件的place布局
    8.8 Tkinter常用控件
        1. Label控件
        2. Frame控件
        3. Button控件
        4. Entry控件
        5. 工具条和状态栏
        6. Text控件
        7. Scrollbar控件
        8. Canvas控件
    8.9 Tkinter的事件
        1. 事件名称
        2. 事件类型
        3. 事件修饰符
        4. 编写事件处理程序
    8.10 Tkinter的主题控件Ttk
        1. ttk.Notebook控件
        2. ttk.Treeview控件
    8.11 Tkinter的扩展控件Tix
        1. 使用Tix
        2. 表格几何管理器Form
        3. tix.Balloon气球窗口小部件
        4. tix.ButtonBox按钮框
        5. tix.ComboBox组合框控件
        6. tix.Control控制窗口

我们希望其它风格的窗口软件界面,这就涉及到软件皮肤设计的问题,下面我们给出2个简单的例子,希望抛砖引玉。
在这里插入图片描述
这个界面的代码如下。

# -*- coding: utf-8 -*-
import  tkinter.ttk  as  ttk   #导入Tkinter.ttk
from PIL import Image, ImageTk
import  HP_tk  as  htk   #导入htk

root=htk.MainWindow(title='tkinter主窗口',x=0,y=0,w=800, h=577,picture='img/2.jpg',zoom=True,center=True)
root.attributes('-topmost',1)  #参数1,设置顶层窗口,覆盖其它窗口。
root.overrideredirect(True)
png1= ImageTk.PhotoImage(Image.open('img/ska1.png'))
png2= ImageTk.PhotoImage(Image.open('img/ska2.png'))
png3= ImageTk.PhotoImage(Image.open('img/ska3.png'))

def Destroy():
    root.destroy()

bt1=ttk.Button(root, width=12, image=png1, command=root.Destroy,cursor='hand2',style='Btn.TButton')
bt2=ttk.Button(root, width=12, image=png2, command=root.setmin,cursor='hand2',style='Btn.TButton')
bt3=ttk.Button(root, width=12, image=png3, command=root.setmax,cursor='hand2',style='Btn.TButton')
bt1.place(x=14,y=544)
bt2.place(x=40,y=544)
bt3.place(x=66,y=544)

root.mainloop()

下面再看一个演示。这里子可以放大或缩小用户窗口。
在这里插入图片描述
(正常窗口)

在这里插入图片描述
(最小化窗口)
在这里插入图片描述
(最大化全屏窗口)

# -*- coding: utf-8 -*-
import  tkinter  as  tk   #导入Tkinter
import  tkinter.ttk  as  ttk   #导入Tkinter.ttk
from PIL import Image, ImageTk
import  HP_tk  as  htk   #导入htk

class skin(tk.Frame): # 继承Frame类  
    def __init__(self, root=None):  
        self.staut=True
        self.minstaut=False
        self.width=root.winfo_width()   #获取窗口宽度(单位:像素)
        self.height=root.winfo_height()  #获取窗口高度(单位:像素)
        tk.Frame.__init__(self, root)  
        self.root = root #定义内部变量root  
        self.s = ttk.Style()
        self.s.configure('.', background='orange', border=100)
        self.s.configure('App.TFrame', background='yellow')
        self.s.configure('Btn.TButton', background='light blue', border=10)
        
        self.v1=tk.Frame(self,background='light blue')
        self.v1.pack(side=tk.TOP, fill=tk.X, expand=1,ipady=1,pady=1,ipadx=1,padx=1)
        
        self.img0=Image.open('ico/kchart.ico')
        self.img1=Image.open('ico/katomic.ico')
        self.img2=Image.open('ico/kpersonalizer.ico')
        self.img3=Image.open('ico/windowlist.ico')
        self.img4=Image.open('ico/exit.ico')
        
        self.img0=htk.imgresize2(48,48,self.img0)
        self.img1=htk.imgresize2(48,48,self.img1)
        self.img2=htk.imgresize2(48,48,self.img2)
        self.img3=htk.imgresize2(48,48,self.img3)
        self.img4=htk.imgresize2(48,48,self.img4)
                
        self.png0= ImageTk.PhotoImage(self.img0)
        self.png1= ImageTk.PhotoImage(self.img1)
        self.png2= ImageTk.PhotoImage(self.img2)
        self.png3= ImageTk.PhotoImage(self.img3)
        self.png4= ImageTk.PhotoImage(self.img4)
        
        
        self.t0 = ttk.Button(self.v1, width=10, image=self.png0, command=self.Destroy,cursor='hand2',style='Btn.TButton')
        self.t1 = ttk.Button(self.v1, width=10, image=self.png1, command=self.Destroy,cursor='hand2',style='Btn.TButton')
        self.t2 = ttk.Button(self.v1, width=10, image=self.png2, command=self.setmin,cursor='hand2',style='Btn.TButton')
        self.t3 = ttk.Button(self.v1, width=10, image=self.png3, command=self.setmax,cursor='hand2',style='Btn.TButton')
        self.t4 = ttk.Button(self.v1, width=10, image=self.png4, command=self.Destroy,cursor='hand2',style='Btn.TButton')
        self.t0.pack(side=tk.LEFT)
        self.t4.pack(side=tk.RIGHT)
        self.t3.pack(side=tk.RIGHT)
        self.t2.pack(side=tk.RIGHT)
        self.t1.pack(side=tk.RIGHT)
        self.pack(side=tk.TOP,fill=tk.X)
        self.Overturn()

    def Destroy(self):
        self.root.destroy()
    
    def Overturn(self):
        self.root.attributes('-topmost',1)  #参数1,设置顶层窗口,覆盖其它窗口。
        self.root.overrideredirect(True)
    
    def setmin(self):
        if self.minstaut:
            self.root.geometry('{}x{}'.format(self.width,self.height))  #改变窗口大小
            self.minstaut=False
        else:
            self.root.geometry('{}x{}'.format(150,30))  #改变窗口大小
            self.minstaut=True
    
    def setmax(self):
        if self.staut:
            self.root.state("zoomed")  #窗口最大化。
            self.staut=False
        else:
            self.root.state("normal")  #设置为普通窗口。
            self.staut=True
            



root=htk.MainWindow(title='tkinter主窗口',x=0,y=0,w=800, h=600,zoom=False,center=True)
sk=skin(root)
maimframe=tk.Frame(root,bg='#1E488F',bd=2)
maimframe.pack(fill=tk.BOTH, expand=tk.YES)

status=htk.StatusBar(maimframe)    #建立状态栏
status.pack(side=tk.BOTTOM, fill=tk.X) #把状态栏放到窗口底部
status.clear()
status.text(0,'状态栏') #在状态栏1输出信息
status.text(1,'超越自我!') #在状态栏2输出信息
status.text(2,'超越!是我们的每一步!')
status.text(3,'版权所有')
status.text(4,'侵权必究')
status.text(5,'设计:小白')
status.config(1,color='red') #改变状态栏2信息颜色
status.config(3,color='green') #改变状态栏2信息颜色
status.config(4,color='blue') #改变状态栏2信息颜色

root.mainloop()

对以上代码有兴趣的朋友可以购买《零基础搭建量化投资系统――以Python为工具》书,加入读者群,下载全部资源和代码。

独狼荷蒲qq:2775205
Python Tkinter小白量化群:524949939
电话微信:18578755056
微信公众号:独狼股票分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章