zzx217的个人博客分享 http://blog.sciencenet.cn/u/zzx217

博文

存在 列表框-按钮=滚动条——Python学习笔记之25:

已有 1737 次阅读 2021-10-29 18:03 |系统分类:科研笔记

  

存在 列表框-按钮-滚动条——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水果列表框

 水果列表框.jpg

(二)列表框与虚拟绑定

水果列表框在虚拟世界建立了一个窗口,于是我们可以对这些虚拟客体借助编码来做一些事情。可做事情很多,以虚拟绑定为例,我们可以对水果列表框做绑定(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()

执行后的屏幕图标,那个绑定的单选水果置于列表框上方。由这个单选,自然可以递进到多选,还可以有很多递进延伸可设想,只要是沿着一条符合经典逻辑的进路。

 程序2.jpg

二、列表框+按钮

列表框进路很多,以上的绑定是一种进路,和按钮的组合,则又是一种进路。列表框可以加上增加键和删除键,理论上怎么加都行,这可以做成程序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执行结果

列表框加按钮.jpg


三、列表框+按钮+滚动条

把滚动条装进程序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执行结果图

 列表框加滚动条.jpg

要使这个图标美观实用,还得下一些功夫。许多空间测量的单位,那都不是很快就能熟知的知识,先就做到这里吧。这个编码合成有点像做游戏的图标拼装,实在的世界好像暂时被搁置到一边,你就是在一个虚拟的世界里来组织计算机的python语言,把它组合得对应于程序的执行,并使这个执行至少产生你愿意得到的结果,即使是不完美的结果也行。

用智慧造就的计算机语言,是人与元宇宙或者虚拟世界进行沟通的语言么?好像还不能这样说。因为语言是用来进行人际沟通的,计算机只是机器。人们进入虚拟世界,最终还是为了人际之间的沟通,而不是人机之间的沟通。就此而言,计算机所构建的虚拟空间,它到底是构成了另一个宇宙,还是本来就和实在世界是一一对应?或者,在计算机世界和实在世界之间,也许还有一些我们完全不知的另一些世界,我们还是留下一些疑问,在继续的探究中寻求答案吧。

 

 

 




https://blog.sciencenet.cn/blog-3478957-1310054.html

上一篇:康先生和哥德尔数配置——哥德尔读后之二十三
下一篇:w一致的故事和符号世界的对应——哥德尔读后之24
收藏 IP: 120.230.131.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-22 16:38

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部