TTk的美化

默认的ttk在linux里实在是太丑了,所以先找一个lib进行基本的美化,这里使用的是ttkbootstrap 项目,和原始ttk兼容,方便使用。

https://ttkbootstrap.readthedocs.io/en/latest/

https://github.com/israel-dryer/ttkbootstrap/

进行简单的配置后,导入一个默认的主题设置,其他的只有在用的时候再去使用方法。

import ttkbootstrap as ttk
from ttkbootstrap.constants import *

top = ttk.Window(themename="cosmo")

规定弹出窗口在屏幕的正中心

sw = top.winfo_screenwidth()
sh = top.winfo_screenheight()
ww = 400
wh = 100
x = (sw-ww) / 2
y = (sh-wh) / 2
top.geometry("{}x{}+{}+{}".format(ww,wh,int(x),int(y)))

调用获得屏幕的尺寸,然后计算得到窗口应有的初始位置

单选框

Var1 = ttk.IntVar()
RBttn = ttk.Radiobutton(top, text = "proj", variable = Var1,value = 1 , command = sel)
RBttn.pack(padx = 5, pady = 5)
RBttn.place(x=10,y=20)
Var1.set(1)

其中Var1是一组单选框共用的一个值,需要用ttk中的方法进行初始化 command的作用是指定调用函数,每次单击选中的时候就会调用sel函数 pack方法是显示这个控件,其中的padxpady 是在控件周围填充的像素点 place 是改变控件的位置,单位同样是像素点 Var1.set(1) 能够让这个按钮默认被选中,括号里的值要和初始化里的value一致

menubutton 的使用

这里只展示一下二级菜单的刷新机制,由于我当前的需要是在切换一级菜单后显示对应的二级菜单,最后甚至使用了global变量,写的实在是丑陋,所以决定不再使用

def fresh_proj_menu() :
    global int_proj_list
    proj_menu = ttk.Menu()
    mmb2 = ttk.Menubutton(top,width = 20,bootstyle="outline",menu = proj_menu ,  textvariable = proj_text ,) 
    i = 0
    int_proj_list = os.popen("ls {}{}".format(common_proj_path,str(father_proj_text.get()))).read().split("\n")
    proj_text.set(int_proj_list[Var3.get()])
    for proj in int_proj_list :
        if i%20 == 0 :
            temp_break = 1
        else :
            temp_break = 0
        temp_button = proj_menu.add_radiobutton(label =proj , variable = Var3,value = i , command = sel3 , columnbreak = temp_break)
        i=i+1
    mmb2.pack()
    mmb2.place(x=120,y=60)

在TKinter的美化版本中,menu菜单会更好用一点,但是带来了一个问题,下拉菜单的冗长以及text和序号的分离带来了很大的麻烦,所以在写了几个嵌套函数后,我决定还是用回combobox作为下拉框的主体

文章作者: Canvas
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Canvas Blog
写代码 python
喜欢就支持一下吧