• 使用tkinter开发GUI程序4 -- tkinter常见控件的特征属性(第二部分)


    1.复选框

    复选框(Checkbutton)是为返回多个选项值的交互控件,通常并不直接触发函数的执行。该控件除具有共同属性外,还具有显示文本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要的属性。

    返回变量variable=var通常可以预先逐项分别声明变量的类型var=IntVar()(默认)或var=StringVar(),在所调用的函数中方可分别用var.get()方法取得被选中实例的onvalue或offvalue值。

    复选框实例通常还可分别利用select()、deselect()和toggle()方法对其进行选中、清除选中和反选操作。

    利用复选框实现,单击“OK”按钮后,可以将选中结果显示在标签上,

    方法1:在函数中用if-else分支实现多项显示。

    1. from tkinter import *
    2. def run():
    3. if (CheckVar1.get() == 0 and CheckVar2.get() == 0 and CheckVar3.get() == 0 and CheckVar4.get() == 0):
    4. s = "您没有选择任何爱好项目"
    5. else:
    6. s1 = "足球" if CheckVar1.get() == 1 else ""
    7. s2 = "篮球" if CheckVar2.get() == 1 else ""
    8. s3 = "游泳" if CheckVar3.get() == 1 else ""
    9. s4 = "骑行" if CheckVar4.get() == 1 else ""
    10. s = "您选择了%s%s%s%s" % (s1, s2, s3, s4)
    11. lb2.config(text=s)
    12. window = Tk()
    13. lb1 = Label(window, text="请选择您的爱好项目:")
    14. lb1.pack()
    15. CheckVar1 = IntVar()
    16. CheckVar2 = IntVar()
    17. CheckVar3 = IntVar()
    18. CheckVar4 = IntVar()
    19. ch1 = Checkbutton(window, text="足球", variable=CheckVar1, onvalue=1, offvalue=0)
    20. ch2 = Checkbutton(window, text="篮球", variable=CheckVar2, onvalue=1, offvalue=0)
    21. ch3 = Checkbutton(window, text="游泳", variable=CheckVar3, onvalue=1, offvalue=0)
    22. ch4 = Checkbutton(window, text="骑行", variable=CheckVar4, onvalue=1, offvalue=0)
    23. ch1.pack()
    24. ch2.pack()
    25. ch3.pack()
    26. ch4.pack()
    27. btn = Button(window, text="OK", command=run)
    28. btn.pack()
    29. lb2 = Label(window, text='')
    30. lb2.pack()
    31. window.mainloop()

    方法2:利用列表和字典实现多项显示。

    由于Python程序中没有其他语言的switch或case这样的枚举分支,当选项较多时,用if-else分支实现会较为烦琐,可充分利用Python特有的列表、字典等数据类型使程序更加简洁高效。本例中还添加了全选、反选和重置按钮:

    1. from tkinter import *
    2. def run():
    3. dic = {0: '', 1: '足球', 2: '篮球', 3: '游泳', 4: '骑行'}
    4. chknum = {CheckVar1.get(), CheckVar2.get(), CheckVar3.get(), CheckVar4.get()}
    5. s = ''
    6. for i in chknum:
    7. s += dic.get(i)
    8. if s == '':
    9. s = "您没有选择任何爱好项目"
    10. else:
    11. s = "您选择了" + s
    12. lb2.config(text=s)
    13. def all():
    14. ch1.select()
    15. ch2.select()
    16. ch3.select()
    17. ch4.select()
    18. def invert():
    19. ch1.toggle()
    20. ch2.toggle()
    21. ch3.toggle()
    22. ch4.toggle()
    23. def cancel():
    24. ch1.deselect()
    25. ch2.deselect()
    26. ch3.deselect()
    27. ch4.deselect()
    28. window = Tk()
    29. lb1 = Label(window, text="请选择您的爱好项目:")
    30. lb1.pack()
    31. CheckVar1 = IntVar()
    32. CheckVar2 = IntVar()
    33. CheckVar3 = IntVar()
    34. CheckVar4 = IntVar()
    35. ch1 = Checkbutton(window, text="足球", variable=CheckVar1, onvalue=1, offvalue=0)
    36. ch2 = Checkbutton(window, text="篮球", variable=CheckVar2, onvalue=2, offvalue=0)
    37. ch3 = Checkbutton(window, text="游泳", variable=CheckVar3, onvalue=3, offvalue=0)
    38. ch4 = Checkbutton(window, text="骑行", variable=CheckVar4, onvalue=4, offvalue=0)
    39. ch1.pack()
    40. ch2.pack()
    41. ch3.pack()
    42. ch4.pack()
    43. btninvert = Button(window, text="反选", command=invert)
    44. btninvert.pack(side=RIGHT)
    45. btnall = Button(window, text="全选", command=all)
    46. btnall.pack(side=RIGHT)
    47. btncancel = Button(window, text="重置", command=cancel)
    48. btncancel.pack()
    49. btn = Button(window, text="OK", command=run)
    50. btn.pack()
    51. lb2 = Label(window, text='')
    52. lb2.pack()
    53. window.mainloop()

     2.列表框与组合框

    列表框(Listbox)可供用户单选或多选所列条目以形成人机交互。列表框控件的主要方法:

    执行自定义函数时,通常使用“实例名.curselection()”或“selected”来获取选中项的位置索引。

    由于列表框实质上就是将Python的列表类型数据可视化呈现,在程序实现时,也可直接将相关列表数据进行操作,然后再通过列表框展示出来,而不必拘泥于可视化控件的方法。

    实现列表框的初始化、添加、插入、修改、删除和清空操作:

    1. from tkinter import *
    2. import tkinter
    3. def ini():
    4. Lstbox1.delete(0, END)
    5. list_items = ["数学", "物理", "化学", "语文", "外语"]
    6. for item in list_items:
    7. Lstbox1.insert(END, item)
    8. def clear():
    9. Lstbox1.delete(0, END)
    10. def ins():
    11. if entry.get() != '':
    12. if Lstbox1.curselection() == ():
    13. Lstbox1.insert(Lstbox1.size(), entry.get())
    14. else:
    15. Lstbox1.insert(Lstbox1.curselection(), entry.get())
    16. def updt():
    17. if entry.get() != '' and Lstbox1.curselection() != ():
    18. selected = Lstbox1.curselection()[0]
    19. Lstbox1.delete(selected)
    20. Lstbox1.insert(selected, entry.get())
    21. def delt():
    22. if Lstbox1.curselection() != ():
    23. Lstbox1.delete(Lstbox1.curselection())
    24. window = Tk()
    25. window.title('列表框学习')
    26. window.geometry('320x240')
    27. frame1 = Frame(window, relief=RAISED)
    28. frame1.place(relx=0.0)
    29. frame2 = Frame(window, relief=GROOVE)
    30. frame2.place(relx=0.5)
    31. Lstbox1 = Listbox(frame1)
    32. Lstbox1.pack()
    33. entry = Entry(frame2)
    34. entry.pack()
    35. btn1 = Button(frame2, text="初始化", command=ini)
    36. btn1.pack(fill=X)
    37. btn2 = Button(frame2, text="添加", command=ins)
    38. btn2.pack(fill=X)
    39. btn3 = Button(frame2, text="插入", command=ins)
    40. # 添加和插入功能实质是一样的
    41. btn3.pack(fill=X)
    42. btn4 = Button(frame2, text="修改", command=updt)
    43. btn4.pack(fill=X)
    44. btn5 = Button(frame2, text="删除", command=delt)
    45. btn5.pack(fill=X)
    46. btn6 = Button(frame2, text="清空", command=clear)
    47. btn6.pack(fill=X)
    48. window.mainloop()

    若不使用按钮,也可对列表控件实例绑定鼠标事件,触发自定义函数的执行,自定义函数应以event作为参数以获取鼠标的选中项目索引。之后还将学习“事件响应”。通常,绑定的鼠标事件是鼠标左键的释放(不是单击,释放时才选中列表框选项)。例如:

    Lstbox1.bind('<ButtonRelease-1>',myfunc)

    单击课程或学分的列表框均可联动实现选课,并将所选课程和学分追加呈现在文本框中:

    1. from tkinter import *
    2. def ini():
    3. list_items = ["数学", "物理", "化学", "语文", "外语"]
    4. for item in list_items:
    5. Lstbox1.insert(END, item)
    6. list_credits = [2.0, 2.5, 1.0, 1.5, 2.0]
    7. for item in list_credits:
    8. Lstbox2.insert(END, item)
    9. def slecurse1(event):
    10. s = '已选' + Lstbox1.get(Lstbox1.curselection()) + str(Lstbox2.get(Lstbox1.curselection())) + '学分\n'
    11. txt.insert(END, s)
    12. def slecurse2(event):
    13. s = '已选' + Lstbox1.get(Lstbox2.curselection()) + str(Lstbox2.get(Lstbox2.curselection())) + '学分\n'
    14. txt.insert(END, s)
    15. window = Tk()
    16. window.title('单击课程或学分均可选课')
    17. window.geometry('320x240')
    18. frame1 = Frame(window, relief=RAISED)
    19. frame1.place(relx=0.0)
    20. frame2 = Frame(window, relief=GROOVE)
    21. frame2.place(relx=0.3)
    22. frame3 = Frame(window, relief=RAISED)
    23. frame3.place(relx=0.6)
    24. Lstbox1 = Listbox(frame1)
    25. Lstbox1.bind('<ButtonRelease-1>', slecurse1)
    26. Lstbox1.pack()
    27. Lstbox2 = Listbox(frame2)
    28. Lstbox2.bind('<ButtonRelease-1>', slecurse2)
    29. Lstbox2.pack()
    30. txt = Text(frame3, height=14, width=18)
    31. txt.pack()
    32. ini()
    33. window.mainloop()

     组合框(Combobox)实质上是带文本框的下拉列表框,其功能也是将Python的列表类型数据可视化呈现,并提供用户单选或多选所列条目以形成人机交互。在图形化界面设计时,由于其具有灵活的界面,因此往往比列表框更受喜爱。但该控件并不包含在tkinter的子模块ttk中。

    如果要使用该控件,应先用from tkinter import ttk语句引用ttk子模块,然后创建组合框实例:

    实例名=Combobox(根对象,[属性列表])

    绑定变量var=tkinter.StringVar(),并设置实例属性textvariable=var,values=[列表...]。

    组合框控件的常用方法有:获得所选中的选项值get()和获得所选中的选项索引current()。

    若不使用按钮,也可对组合框控件实例绑定事件,触发自定义函数的执行,自定义函数应以event作为参数以获取所选中项目索引。通常,绑定的事件是组合框中某选项被选中(注意,事件的代码是用两个小于号和两个大于号作为界定符的)。例如:

    comb1.bind('<<ComboboxSelected>>',myfunc)

     实现四则运算计算器,将两个操作数分别填入两个文本框后,通过选择组合框中的算法触发运算:

    1. from tkinter import *
    2. from tkinter.ttk import *
    3. def calc(event):
    4. a = float(t1.get())
    5. b = float(t2.get())
    6. dic = {0: a + b, 1: a - b, 2: a * 3, 3: a / b}
    7. c = dic[comb.current()]
    8. lb1.config(text=str(c))
    9. window = Tk()
    10. window.title('四则运算')
    11. window.geometry('320x240')
    12. t1 = Entry(window)
    13. t1.place(relx=0.1, rely=0.1, relwidth=0.2, relheight=0.1)
    14. t2 = Entry(window)
    15. t2.place(relx=0.5, rely=0.1, relwidth=0.2, relheight=0.1)
    16. var = StringVar()
    17. comb = Combobox(window, textvariable=var, values=['加', '减', '乘', '除'])
    18. comb.place(relx=0.1, rely=0.5, relwidth=0.2)
    19. comb.bind('<<ComboboxSelected>>', calc)
    20. lb1 = Label(window, text='结果')
    21. lb1.place(relx=0.5, rely=0.7, relwidth=0.2, relheight=0.3)
    22. window.mainloop()

     通常,大型软件设计分为程序编码设计和用户界面(User Interface,UI)设计两个部分,它们分属于不同团队。上述四则运算计算器也可用下面代码,运用面向对象程序设计的思想,实现界面设计与业务逻辑的相互独立。这里,Ui类负责程序界面的布局,而App类作为Ui的子类,完成运算处理。

    1. from tkinter import *
    2. from tkinter.ttk import *
    3. class Ui(Frame):
    4. """ 生成界面的类 """
    5. def __init__(self, master=None):
    6. Frame.__init__(self, master)
    7. self.master.title('四则运算')
    8. self.master.geometry('320x240')
    9. self.createWidgets()
    10. def createWidgets(self):
    11. self.top = self.winfo_toplevel()
    12. self.Text1 = Entry(self.top)
    13. self.Text1.place(relx=0.1, rely=0.1, relwidth=0.3, relheight=0.1)
    14. self.Text2 = Entry(self.top)
    15. self.Text2.place(relx=0.5, rely=0.1, relwidth=0.3, relheight=0.1)
    16. self.CombolList = ['加', '减', '乘', '除']
    17. self.CombolVar = StringVar(value='加')
    18. self.Combol = Combobox(self.top, textvariable=self.CombolVar, values=self.CombolList)
    19. self.Combol.place(relx=0.1, rely=0.5, relwidth=0.4)
    20. self.Combol.bind('<<ComboboxSelected>>', self.calc)
    21. self.Label1 = Label(self.top)
    22. self.Label1.place(relx=0.5, rely=0.6, relwidth=0.4, relheight=0.2)
    23. class App(Ui):
    24. """ 继承Ui,为Ui的子类,处理业务逻辑 """
    25. def __init__(self, master=None):
    26. Ui.__init__(self, master)
    27. def calc(self, event):
    28. a = float(self.Text1.get())
    29. b = float(self.Text2.get())
    30. dic = {0: a + b, 1: a - b, 2: a * b, 3: a / b}
    31. c = dic[self.Combol.current()]
    32. self.Label1.config(text=str(c))
    33. if __name__ == '__main__':
    34. top = Tk()
    35. gui = App(top) # 实例化
    36. gui.mainloop()

  • 相关阅读:
    连接器信号完整性仿真教程 八
    文件夹内文件删除如何恢复?分享四种方法,快收藏保存起来
    b站江科大stm32笔记(持续更新)
    使用C语言实现链队(带头结点和不带头结点)
    MySQL 索引测试
    性能测试面试问题,一周拿3个offer不嫌多
    ucos iii 任务栈使用率统计方法
    Leetcode 142. 环形链表 II
    结构体声明与初始化
    获得淘宝app商品详情原数据 API 的图解
  • 原文地址:https://blog.csdn.net/weixin_51995147/article/details/125470984