首先,这里必须强调,尽管python的创始人提到过python没有主打领域,后来者可以无限丰富它,但是时至今日, python语言已经找到了自己的路,但这些路里面绝对没有GUI开发。所以这里只做粗浅的介绍,而且Tkinter也不是python中常用的GUI,因为确实不好看。
以下几个常见的:
- Tkinter:绑定TK GUI工具集,用python包装的tcl代码, 轻量级,但是很丑
- PyGTK:Tkinter的代替品
- wxPython:跨平台GUI
- PyQT:跨平台,商业授权有问题,个人开发可能有版权问题,但好用
Tkinter几类组件:
布局方式:
pack:方位布局
place:坐标布局
gird:网格布局
相关设置请看源码,常用的都会测试到。
按钮:
Button
RadioButton
CheckButton
Listbox
文本输入组件:
Entry:单行
Text:多行
标签:
label:显示图片和文字
Message:根据内容文字换行
菜单:
Menu
MenuButton
滚动条:
scale:滑块组件
Scrollbar滚动条组件
其他组件:
Canvas:画布组件
Frame:框架组件,将多个组件分组
Toplevel:创建子窗口容器组件
启动消息循环在所有组件设置的最后
test1:
import tkinter
# 类似java Frame的顶层容器
base = tkinter.Tk()
base.wm_title("test")
# label测试
lb1 = tkinter.Label(base, text="这是label1")
# 布局设置,pack是一种自适应布局
lb1.pack()
lb2 = tkinter.Label(base, text="这是label2")
lb2.pack()
# entry测试
et1 = tkinter.Entry(base)
et1.pack()
et2 = tkinter.Entry(base)
et2.pack()
et2["show"] = "*"
# button测试
def cmd1():
base.wm_title("你按下了按钮,我得到你的输入为{}".format(et1.get()))
btn = tkinter.Button(base, text="我是按钮,戳我", command=cmd1)
btn.pack()
# 消息循环,放在组件设置的最后
base.mainloop()
test2:
import tkinter
# 级联菜单测试
baseFrame = tkinter.Tk()
menubar = tkinter.Menu(baseFrame)
baseFrame["menu"] = menubar
menubar2 = tkinter.Menu(menubar)
l = ["选项1-1", "选项1-2", "选项1-3"]
for i in l:
menubar2.add_command(label=i)
menubar.add_cascade(label="选项1", menu=menubar2)
menubar.add_command(label="选项2")
baseFrame.mainloop()
test3:
import tkinter
def makeLabel():
global baseFrame
tkinter.Label(baseFrame, text="点了你点了").pack()
# 弹出菜单
baseFrame = tkinter.Tk()
menubar = tkinter.Menu(baseFrame)
for i in ["选项1", "选项2", "选项3"]:
menubar.add_separator()
menubar.add_command(label=i)
menubar.add_command(label="你牛逼你点我啊", command=makeLabel)
def pop(event):
# 监听位置
menubar.post(event.x_root, event.y_root)
baseFrame.bind("<Button-3>", pop)
baseFrame.mainloop()
test4:
import tkinter
baseFrame = tkinter.Tk()
cvs = tkinter.Canvas(baseFrame, width =300, height = 200)
cvs.pack()
cvs.create_line(1,1,100,200)
baseFrame.mainloop()
其他更多设置可在pycharm下按住ctrl选中名称获得源码查看属性。
由以上测试可知GUI组件使用套路一致:
1创建窗口,顶级容器
2创建各个类型组件,指明父亲位置,触发事件,设置布局
3为主窗口设置消息循环