Tkinter的使用
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
方法是显示这个控件,其中的padx
和pady
是在控件周围填充的像素点 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作为下拉框的主体