Python 编程之Tkinter的使用02

  • 原文博客地址: Python编程之Tkinter的使用02
  • TkinterPython的标准GUI库。Python使用 Tkinter可以快速的创建GUI应用程序。
  • 由于Tkinter是内置到python的安装包中、只要安装好Python之后就能import Tkinter库、而且IDLE也是用Tkinter编写而成、对于简单的图形界面Tkinter还是能应付自如
  • 上一篇文章介绍了Tkinter模块和Button, Label等部分控件
  • 这里主要介绍Listbox, Scale, Menu, Frame等部分控件的使用
  • GitHub代码示例目地址

Listbox列表框

一个可以包含一个或多个文本项的列表框,可以设置为单选或多选

创建Listbox

lb = Listbox(window, selectmode = EXTENDED)
lb.pack()
复制代码
  • selectmode: 设置列表框的样式(默认值-BROWSE), 有四个可选项
    • SINGLE: 单选, 不能通过鼠标的移动选中新的item, 只能点选
    • BROWSE: 单选, 可以通过鼠标的移动选中新的位置(item并不会移动)
    • MULTIPLE: 多选, 但是只能通过鼠标点击进行多选
    • EXTENDED: 多选, 按住Shift可以实现连选, 按住Control可以实现多选

添加元素

  • Listbox使用insert来添加一个元素,其中参数一为添加的索引值, 参数二为要添加的元素
  • 索引ACTIVE是向当前选中的item前插入一个(即使用当前选中的索引作为插入位置)
  • 索引END是想最后添加一个元素
for item in ["good", "nice", "handsome", "vg", "vn"]:
    # 按顺序添加
    lb.insert(END, item)
# 在开始位置添加
lb.insert(ACTIVE, 'Titan')
# 在最后添加
lb.insert(END, 'jun')
# 在具体的索引出添加元素
lb.insert(2, 'lululu')
# 把列表当成一个元素添加
lb.insert(ACTIVE, [1, 2, 3])
# 添加元组
lb.insert(ACTIVE, ('che', '09'))
复制代码

删除/选中

def selection_set(self, first, last=None):
复制代码
  • 该函数为选中操作的函数, 需要两个参数, 其中
  • 参数1: 开始的索引值
  • 参数2: 结束的索引值(可选值, 可不指定)
  • 若不指定参数2, 则函数只对参数1的索引值进行操作
  • 删除/取消选中/取值等函数类似
#删除  参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只删除第一个索引处的内容
# lb.delete(1, 2)
# lb.delete(1)

#选中   参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只选中第一个索引处的内容
lb.selection_set(2, 5)
lb.selection_set(0)

# 取消
lb.selection_clear(3, 4)
lb.selection_clear(0)

#获取到列表中的元素的个数
print(lb.size())

#从列表中取值  参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只获取第一个索引处的内容
print(lb.get(1, 3))
print(lb.get(5))

#返回当前的索引项,不是item元素
print(lb.curselection())

# 判断某选项是否被选中
print(lb.selection_includes(3))
print(lb.selection_includes(5))
复制代码

变量和事件绑定

  • 变量绑定和之前的控件帮定变量一样
  • Listbox不支持command属性来设置回调函数了,使用bind来指定回调函数
# 绑定变量
lbv = StringVar()
lb = Listbox(window, selectmode = SINGLE, listvariable = lbv)
lb.pack()

for item in ["good", "nice", "handsome", "jun", "titan"]:
    lb.insert(END, item)

# 打印当前列表中的选项
print(lbv.get())
print(lb.get(1))

# 设置选项(所有重新赋值)
# lbv.set((1, 2, 3))

# 绑定事件
def listboxAction(event):
    print(lb.get(lb.curselection()))

# 第一个参数表示操作样式, 这里是双击操作, 1代表鼠标左键
lb.bind('<Double-Button-1>', listboxAction)
复制代码

滚动显示

Listbox的内容超过所容纳范围时, 内容需要滚动显示, 类似上文中提到的Text文本的多行显示, 这里就需要添加滚动条

效果图如下

# 滚动
lb = Listbox(window, selectmode=EXTENDED)
for item in ["good", "nice", "handsome", "from", "thinter","good1", "nice1", "handsome1", "vg1", "vn1","good3", "nice3", "handsome3", "vg3", "vn3"]:
    lb.insert(END, item)

# 滚动条
sc = Scrollbar(window)
sc.pack(side = RIGHT, fill = Y)
lb.configure(yscrollcommand = sc.set)
lb.pack(side = LEFT, fill = BOTH)
# 额外给属性赋值
sc["command"] = lb.yview
复制代码

Scale拽指示器

供用户通过拖拽指示器改变变量的值,可以水平,也可以竖直, 下面是相关属性介绍

  • from_: 设置最小值
  • to: 设置最大值
  • resolution: 步距, 每次移动增加的最小单位
  • orient: 显示方向(水平-HORIZONTAL, 垂直-Variable)
  • variable: 绑定变量
  • command: 绑定回调函数
  • length: 控件的长度(垂直方向上则是高度)
  • digits: 控制显示的数字位数
scale = Scale(window, from_ = 0, to = 100, orient = HORIZONTAL, length = 200, label='choice:')
scale.pack()

# 设置初始值
scale.set(34)

# 取值
def showNumber(event):
    print(scale.get())

scale["command"] = showNumber
复制代码

效果图如下

Spinbox数值范围控制器

  • 组件Spinbox和组件Scale类似, 都是根据需求显示一个范围内的内容
  • 区别: Spinbox去能拖拽, 只能点击增加或减少; Scale可以拖拽选择
# 绑定变量
spinStr = StringVar()

# 事件监听
def updateAction():
    # 在最后拼接上'12'
    # spin1.insert(END, 12)
    print(spinStr.get())


'''属性介绍:
from_: 起始值
to: 最大值
increment: 步长
textvariable: 绑定变量
command: 绑定函数, 事件监听
values: 设置后, 每次更新值将使用values指定的值
'''

# spin = Spinbox(window, from_ = 0, to = 100, increment = 10, textvariable = spinStr, command = updateAction)
# spin.pack()

spin1 = Spinbox(window, values=[0, 10, 30, 50, 80, -9], increment = 10, textvariable = spinStr, command = updateAction, bg='red')
spin1.pack()
复制代码

效果图如下

Menu菜单

Menu是被用来显示在标题栏/窗口或者其他顶层窗口上的菜单栏

顶层菜单

添加菜单项, 单纯的添加之后没有任何效果

# 菜单条
menubar = Menu(window)
window.configure(menu=menubar)
复制代码

下面给菜单添加菜单列表选项, 添加之后只有菜单列表, 但是每一个菜单却没有下拉列表

# 创建一个菜单选项
menu1 = Menu(menubar, tearoff=False)
# 想菜单条上添加菜单选项
menubar.add_cascade(label='语言', menu=menu1)

menu2 = Menu(menubar, tearoff=False)
menubar.add_cascade(label='颜色', menu=menu2)
复制代码

给每一个菜单添加下拉列表和监听事件

def menuAction1():
    print('menubar')

# 菜单条
menubar = Menu(window)
window.configure(menu=menubar)


# 创建一个菜单选项
menu1 = Menu(menubar, tearoff=False)
# 菜单选项添加内容
for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
    if item == 'Exit':
        # 添加分割线
        menu1.add_separator()
        menu1.add_command(label=item, command=window.quit)
    else:
        menu1.add_command(label=item, command=menuAction1)

# 想菜单条上添加菜单选项
menubar.add_cascade(label='语言', menu=menu1)


# 菜单2的事件处理
def menuAction2():
    print(menuStr.get())

menuStr = StringVar()

menu2 = Menu(menubar, tearoff=True)
for item in ['red', 'orange', 'blue', 'gray']:
    menu2.add_radiobutton(label=item, variable=menuStr, command=menuAction2)
# 添加到菜单列表
menubar.add_cascade(label='颜色', menu=menu2)

复制代码

效果图如下

tearoff属性介绍

  • tearoff是控制菜单能否独立出来的属性, 取值有TrueFalse
  • tearoff设置为True以后,就是表明这个菜单是可以独立出来的,如果是False的话就不可以独立出来
  • 我在Mac中尝试了一下, 发现没有什么效果; 在Windows系统中会有一条虚线, 点击虚线, 会跳出一个悬浮菜单; 有Windows系统的童鞋可以试一下

右键菜单

# 鼠标右键菜单
menubar2 = Menu(window)

menu3 = Menu(menubar2, tearoff=False)
for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
    menu3.add_command(label=item)

menubar2.add_cascade(label='开发语言', menu=menu3)

# 用于显示菜单
def showMenu(event):
    print('window')
    # 鼠标点击处的坐标
    menubar2.post(event.x_root, event.y_root)

# window绑定鼠标事件
window.bind("<Button-2>", showMenu)
复制代码

效果图如下

添加删除菜单

菜单中每一项的删除和添加都是根据索引操作的

# 添加/删除菜单
def menuClick():
    print("menu3")

# 添加command项
menu3.insert_command(1, label='command', command=menuClick)

# 添加radiobutton项
menu3.insert_radiobutton(3, label='radiobutton', command=menuClick)

# 添加checkbutton项
menu3.insert_checkbutton(5, label='checkbutton', command=menuClick)

# 添加分割线
menu3.insert_separator(4)
# menu3.insert_separator(0)


# 删除
# 两个参数: 参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只获取第一个索引处的内容
menu3.delete(2, 4)
menu3.delete(0)
复制代码

Combobox下拉控件

# 绑定变量
cv = StringVar()
combo = ttk.Combobox(window, textvariable=cv)
combo.pack()

# 设置下拉菜单数据(元组数据)
combo['value'] = ('杭州', '湖州', '温州', '嘉兴', '舟山')

# 设置默认值
combo.current(0)

# 绑定事件
def comboboxClick(event):
    print(cv.get())
    print(combo.get())

combo.bind('<<ComboboxSelected>>', comboboxClick)
复制代码

效果图如下

Frame布局

Frame就是屏幕上的一块矩形区域,多是用来作为容器(container)来布局窗体

# 第一层容器
frame = Frame(window)
frame.pack()

# 左边容器
leftFrame = Frame(frame)
Label(leftFrame, text='左上位置', bg='red', height=5, width=10).pack(side=TOP)
Label(leftFrame, text='左下位置', bg='yellow', height=5, width=10).pack(side=TOP)
leftFrame.pack(side=LEFT)

# 右边容器
rightFrame = Frame(frame)
Label(rightFrame, text='右上位置', bg='orange', height=5, width=10).pack(side=TOP)
Label(rightFrame, text='右下位置', bg='blue', height=5, width=10).pack(side=TOP)
rightFrame.pack(side=RIGHT)
复制代码

效果图如下

  • 至此, Tkinter的大部分组件已经基本都介绍完了
  • 接下来将会介绍一些Tkinter涉及到的数据类型和布局方式
  • 以及鼠标的点按事件和一些特殊的事件操作
  • 未完待续.............
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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/wxPython等GUI库,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀, 而且不够环保,不够低碳,要带一个很大的库,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK的界面不够美观,不过我经过多次实验后发现导入Python自带的标准TTK主题库,界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用写一句代码就可以生成一个完整可运行的Python的GUI界面,支持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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值