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

106 篇文章 119 订阅
104 篇文章 107 订阅

@用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
微信公众号:独狼股票分析

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个VB6的IDE插件(Addin),使用VB6的IDE直接设计Python的界面。 Python和VB都是能让人快乐的编程语言,我使用了Python之后,很多自己使用的工具都使用Python开发或改写了,因为最终实现的Python代码实在太短了(相比VB),有时候Python一行代码就可以实现VB一个函数的功能。 Python就是这种让人越用越开心的语言。 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准库Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的偶来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局,不够直观,而且用起来很不爽。。 至于PyQt/wxPythonGUI库,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀, 而且不够环保,不够低碳,要带一个很大的库,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK的界面不够美观,不过我经过多次实验后发现导入Python自带的标准TTK主题库,界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用写一句代码就可以生成一个完整可运行的PythonGUI界面,支持2.X和3.X。 安装方法:将压缩包解压到你希望的目录,然后执行Setup.exe完成注册插件过程,打开VB6就可以用了。 在VB窗体上设计完成界面后(你可以大胆的设置各控件的属性,Addin尽量将其翻译为tkinter的控件属性),点工具栏上的VisualTkinter(图标为一片羽毛),再点'生成代码'按钮,即可生成可运行的Python代码,可以拷贝至剪贴板或保存至文件。 一般情况下你可以不用再改变tkinter的控件属性,但是如果你熟悉tkinter,需要更多的控制,可以一一核对各属性,并且修改,再生成代码。 当然除了用来设计界面外,此ADDIN内置的各控件属性列表可以做为编程参考,比较完整,除了极少数我认为大多数人都不用的属性外,属性定义基本上是我从官方的tkinter文档直接翻译的。 如果还没有VB6,网上找一个VB6精简版即可,不到20M,小巧玲珑。 代码已经在Github上托管,更新的版本可以在这上面找到,需求也可以在上面提: https://github.com/cdhigh/Visual-Tkinter-for-Python

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷蒲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值