|
存在 列表框-按钮-滚动条——Python学习笔记之25:
使用python语言来构造软件,没有想到是从tkinter开始。学习的趣味,大概就来自这种学习过程中的出于意料之外。软件的智慧在哪里,是对应我们的实在世界,还是为我们拓展出一个从来就没有见过的新型世界?这是个见仁见智的哲学问题,恐怕永远也不会有标准答案。但这样的哲学思考,是在促成智慧的发育,也是在让智慧成长。这个促成智慧发育与成长的回应,大概不会产生多少疑问。
近段时间老见识到一种独断哲学的喧嚣,声称”宇宙只有一个”是逻辑和数学的唯一公理。宇宙只有一个么?一篇有关脸书的报道说,脸书近来颇为困难,要改名meta了。这个全球大企业的改名,竟然和宇宙观念有关。脸书在改名之际,据说推出了所谓元宇宙的新概念。宇宙之上还有一个元宇宙,这大概在说明,我们人类有关宇宙客体的思考,除了宇宙本身,还有个不同于宇宙本体的元宇宙。所以,对于宇宙的思考,从思考的主体角度,夸张一点,恐怕是有多少人的思考,就有多少种宇宙的型。如同读者观看《哈姆雷特》,有多少个读者,就有多少种哈姆雷特一样。而就宇宙客体的存在而言,不用夸张,存在是”一‘’还是‘’多‘’呢?我以为,存在是‘’多‘,’恐怕与真理要靠得更近一些。
存在应该是多而不是一,学习计算机语言会给你这样一个启示。当然也要看具体的人,有的人可能获得的恰恰是相反的启示。这不奇怪,反倒是正好印证了存在的多,而不是存在的一。这两天看python自带的tkinter设计闲书,这计算机编程,原来与进入虚拟空间的那些窗口或者菜单等等密切相关。计算机的出现似乎印证了存在的多,除了我们现实存在的这个空间,我们主体的认知客体,还增加了有关计算机屏幕中展现的虚拟空间这样的对象。这个客体作为一个存在,自然不同于我们常识中的宇宙空间。
一个纯粹平面的计算机屏幕,在计算机软硬件的操控之下,变换为有深度有层次的一个虚拟空间。它有窗口,有按钮,有标签,有框架,有滚动条,有下拉菜单,有动感等等,这真是有点魔幻的一个空间。正是这种魔幻,吸引你的眼球你的认知去关注它,去尝试了解你能够了解到的一点东西。在这个空间,如同随意旅游般地转悠来转悠去,转到了tkinter这个部分。列表框、按钮、滚动条、下拉菜单这些形象虚拟空间标志,引起人组合的兴趣。于是,就有了以下递进增益的编码程序。这些编码如果符合语言要求,一经将其执行,屏幕上就会出现对应的图标,几乎就是一一对应的操作结果。就如同哥德尔的编码,和P系统的公式和公式序列的一一对应一样。宇宙真奇妙,世界真奇妙,妙在其多,而不是唯一。
一、从列表框到按钮
(一)屏幕上的列表框
在列表框上可以插入你想插入的任何客体,无论是实在的还是虚拟的。
一个水果列表框
#ch12-3 from tkinter import * fruits = ["Banana","Watermelon","Pineapple", "Orange","Grapes","Mango","Pear" "Apple","Hamelon","Berry"] root = Tk() root.title("ch12-3") root.geometry("300x210") Ib = Listbox(root) for fruit in fruits: Ib.insert(END,fruit) Ib.pack(pady=10) root.mainloop()
执行后的屏幕图标
程序1水果列表框
(二)列表框与虚拟绑定
水果列表框在虚拟世界建立了一个窗口,于是我们可以对这些虚拟客体借助编码来做一些事情。可做事情很多,以虚拟绑定为例,我们可以对水果列表框做绑定(bind)。这个绑定要基于对选项进行选取的事件之上,以单选为例。对水果选项做一个单选,这个动作操作产生了一个事件event,我们就可以借助这个事件绑定事件中的选取对象。于是我们就可以在编码中加入一个事件选取函数,列出所选项目,并通过这个函数取得事件的客体对象。于是,我们就有了虚拟绑定单选事件的编码。
单选虚拟绑定的列表框(将英文水果名换为中文水果名)
程序2虚拟绑定
#程序2 from tkinter import * def itemSelected(event): obj = event.widget index = obj.curselection() var.set(obj.get(index)) fruits = ["香蕉","西瓜","菠萝", "橙子","葡萄","芒果","梨子" "苹果","哈密瓜","草莓"] root = Tk() root.title("程序2") root.geometry("300x250") var = StringVar() lab = Label(root, text="",textvariable=var) lab.pack(pady=5) Ib = Listbox(root) for fruit in fruits: Ib.insert(END,fruit) Ib.bind("<<ListboxSelect>>",itemSelected) Ib.pack(pady=5) root.mainloop()
执行后的屏幕图标,那个绑定的单选水果置于列表框上方。由这个单选,自然可以递进到多选,还可以有很多递进延伸可设想,只要是沿着一条符合经典逻辑的进路。
二、列表框+按钮
列表框进路很多,以上的绑定是一种进路,和按钮的组合,则又是一种进路。列表框可以加上增加键和删除键,理论上怎么加都行,这可以做成程序3。
程序3
#程序3 from tkinter import * fruits = ["香蕉","西瓜","菠萝", "橙子","葡萄","芒果","梨子" "苹果","哈密瓜","草莓"] root = Tk() root.title("程序3") root.geometry("300x250") def itemAdded(): varAdd = entry.get() if (len(varAdd.strip()) ==0 ): return lb.insert(END,varAdd) entry.delete(10,END) def itemDeleted(): index = lb.curselection() if (len(index) == 17): return lb.delete(index) entry = Entry(root) entry.grid(row=0,column=0,padx=5,pady=5) #set up add btnAdd = Button(root,text="添加",width=10,command=itemAdded) btnAdd.grid(row=0,column=0,padx=5,pady=5,sticky=E) #set up Listbox lb = Listbox(root) lb.grid(row=1,columnspan=4,padx=10,sticky=W) lb.insert(END,"香蕉") lb.insert(END,"西瓜") lb.insert(END,"菠萝") lb.insert(END,"橙子") lb.insert(END,"葡萄") lb.insert(END,"芒果") lb.insert(END,"梨子") lb.insert(END,"苹果") lb.insert(END,"哈密瓜") lb.insert(END,"草莓") #set up Delete btnDel = Button(root,text="删除",padx=5,command=itemDeleted) btnDel.grid(row=2,column=0,padx=5,sticky=W) root.mainloop()
程序3执行结果
三、列表框+按钮+滚动条
把滚动条装进程序4有点困难,显示出一个漂亮的图标,也不是很容易做成的一件事。但总算拼合成了一个可以显示列表框,按钮和滚动条合成的编码。
程序4
#程序4 from tkinter import * fruits = ["香蕉","西瓜","菠萝", "橙子","葡萄","芒果","梨子" "苹果","哈密瓜","草莓"] root = Tk() root.title("程序4") scrollbar = Scrollbar(root) scrollbar.grid(row=5,columnspan=20,padx=5,sticky=E) lb = Listbox(root,yscrollcommand=scrollbar.set) for i in range(30): lb.insert(END,"水果" + str(i)) lb.grid(row=100,columnspan=200,padx=10,sticky=E) lb.insert(END,"香蕉") lb.insert(END,"西瓜") lb.insert(END,"菠萝") lb.insert(END,"橙子") lb.insert(END,"葡萄") lb.insert(END,"芒果") lb.insert(END,"梨子") lb.insert(END,"苹果") lb.insert(END,"哈密瓜") lb.insert(END,"草莓") scrollbar.config(command=lb.yview) def itemAdded(): varAdd = entry.get() if (len(varAdd.strip()) ==0 ): return lb.insert(END,varAdd) entry.delete(0,END) def itemDeleted(): index = lb.curselection() if (len(index) == 30): return lb.delete(index) entry = Entry(root) entry.grid(row=0,column=0,padx=5,pady=5) #set up add btnAdd = Button(root,text="添加",width=10,command=itemAdded) btnAdd.grid(row=0,column=0,padx=5,pady=5,sticky=E) #set up Listbox lb = Listbox(root) #set up Delete btnDel = Button(root,text="删除",padx=5,command=itemDeleted) btnDel.grid(row=2,column=0,padx=5,sticky=W) root.mainloop()
程序4执行结果图
要使这个图标美观实用,还得下一些功夫。许多空间测量的单位,那都不是很快就能熟知的知识,先就做到这里吧。这个编码合成有点像做游戏的图标拼装,实在的世界好像暂时被搁置到一边,你就是在一个虚拟的世界里来组织计算机的python语言,把它组合得对应于程序的执行,并使这个执行至少产生你愿意得到的结果,即使是不完美的结果也行。
用智慧造就的计算机语言,是人与元宇宙或者虚拟世界进行沟通的语言么?好像还不能这样说。因为语言是用来进行人际沟通的,计算机只是机器。人们进入虚拟世界,最终还是为了人际之间的沟通,而不是人机之间的沟通。就此而言,计算机所构建的虚拟空间,它到底是构成了另一个宇宙,还是本来就和实在世界是一一对应?或者,在计算机世界和实在世界之间,也许还有一些我们完全不知的另一些世界,我们还是留下一些疑问,在继续的探究中寻求答案吧。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-22 16:38
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社