学习Python编程,胡乱地看了几本书,在GUI这个位置给弄得不知如何是好了,于是弄到一本通俗些的菜鸟编程,题目直截了当就是GUI设计。一口气看了六章,好像还没找到你下笔写学习笔记的那个感觉。但这六章从控件widget谈起,轻巧地把控件属性,然后是窗口,标签,按钮,还有文本框到变量类别简略道来,真还让人对编程的起步有了点扎实的认知。
这些东西似乎完全不带主体信息,只是信息门面性、框架性的东西。但琢磨一下,如果你没有先行构建,主体信息从何而来?这个GUI知识的初知,看来就是编程的初阶,想弯道超过去不理睬,哪里有这种可能?这犹如一个人出门旅行,旅行前总得摸索些路径,旅行时也得依据一些路径来实现你的旅行计划。而旅行者则在这路径经历的过程中,积累关于旅行的各种各样的信息。古代打仗是兵马未到粮草先行,在编程这个领域,大概是框架容器先有,然后才是主体信息。这个世界也许因为这计算机和计算机语言的出现,把我们的认知来了个大翻个。
能够做成一个什么样的,可以集所学构件合成的一个编程呢?大概也如同GUI设计编程的次序那样,从窗口window的根部root开始。
先建一个根部窗口,给他起一个名字combine,并配置相应的属性。然后,一点一点地把那些你想到的其它构件装进去。因为这个窗口还有另外一个别名,称为容器container。我们似乎可以按苦芦画瓢、或者稍稍改变一下现成的代码,然后来一个整合。
Root窗口
#root.py
from tkinter import *
root = Tk()
root.title('combine1')
root.geometry('900x480')
root.configure(bg='blue')
root.mainloop()
有了窗口就可以给窗口加上标签,既可以加上文字标签,也可以加上位图和图像标签,由此就可以有以下编程代码。
这就有文字标签combine1.py
#combine.py20210811
from tkinter import *
root = Tk()
root.title('combine2')
root.geometry('900x480')
root.configure(bg='blue')
label1=Label(root,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label1.pack()
root.mainloop()
而要想添加上位图代码,又有文字位图标签
#combine2.py20210811
from tkinter import *
root = Tk()
root.title('combine2')
root.geometry('900x480')
root.configure(bg='blue')
label1=Label(root,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label1.pack()
label2=Label(root,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=10,pady=20,
font='Helvetic 20 bold',
compound='right')
label2.pack()
root.mainloop()
还可以加上图片,由此有:
from tkinter import *
root = Tk()
root.title('combine2')
root.geometry('900x480')
root.configure(bg='blue')
label1=Label(root,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label1.pack()
label2=Label(root,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=10,pady=20,
font='Helvetic 20 bold',
compound='right')
label2.pack()
seven = PhotoImage(file='seven.gif')
label3=Label(root,image=seven)
label3.pack()
root.mainloop()
三个标签从上到下排列,可以不可以横着排成一行呢?用root窗口测试的结果,发现排不了,也许是对root的认知不够吧。但菜鸟编程和shell的提示告知,那个geometry好像跟grid分格模式不相匹配,这让人又学了一招。原来除了根部窗口之说,还有直接使用的窗口window,大概只有这个window之下才有窗口分格的grid可用。于是把原先的root根部窗口换为window,再来配置三个标签,让三个标签排成一排。这需要使用表格的横行column和竖行row的指令。由此而先有combine3,因为对于行与列的序号编排有一个熟悉过程,这个combine3调试多次而成。
#combine2.py20210811
from tkinter import *
window = Tk()
window.title('combine3')
label1=Label(window,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold',
width=15)
label2=Label(window,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=60,pady=120,
font='Helvetic 20 bold',
width=15)
label1.grid(row=0,column=1)
label2.grid(row=0,column=0)
window.mainloop()
在这个基础上,文字、位图和图片可以共存么?原来是,在root根部窗口可以竖行共存,横行共存还没有找到方法,也许就是不相容。
#combine21.py20210811
from tkinter import *
root = Tk()
root.title('combine31')
root.geometry('900x480')
root.configure(bg='blue')
label1=Label(root,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label1.pack()
label2=Label(root,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=10,pady=20,
font='Helvetic 20 bold',
compound='right')
label2.pack()
seven = PhotoImage(file='seven.gif')
label3=Label(root,image=seven)
label3.pack()
root.mainloop()
但有趣的是,在window窗口中,位图和图片不容,若有图片,则位图自然消失。
#combine31.py20210812
from tkinter import *
window = Tk()
window.title('combine31')
label1=Label(window,text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold',
width=15)
label2=Label(window,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=60,pady=120,
font='Helvetic 20 bold',
width=15)
seven = PhotoImage(file='seven.gif')
label3=Label(window,image=seven)
label1.grid(row=0,column=1)
label2.grid(row=0,column=0)
label3.grid(row=0,column=0)
window.mainloop()
在window的窗口上可以装上按钮或者文本框么?好像不大好做,似乎只有root窗口才能配置按钮,先试着给root窗口的编程combine3添两个按钮,open和close。竟然成功了。
#combine21.py20210811
from tkinter import *
def msgShow1():
label1.config(text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
root = Tk()
root.title('combine31')
label1=Label(root)
btn1=Button(root,text='OPEN',width=15,command=msgShow1)
btn2=Button(root,text='CLOSE',width=15,command=root.destroy)
label1=Label(text='I like GUI',
relief='solid',
fg='yellow',bg='blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label1.pack()
btn1.pack(side=LEFT)
btn2.pack(side=LEFT)
label2=Label(root,bitmap='hourglass',
fg='red',bg='blue',
text='the sky is blue',
padx=10,pady=20,
font='Helvetic 20 bold')
label2.pack()
seven = PhotoImage(file='seven.gif')
label3=Label(root,image=seven)
label3.pack()
root.mainloop()
看来增添文本框也是可能的,还可以增添许多东西。而且,不仅root根部窗口可添,window窗口也应该可添,这都留给以后的编程吧。
不过,这个给root空间和window空间添砖加瓦的经历,似乎让人感觉到,这个世界因为电子技术的发展,人们对空间的理解似乎除了自然空间之外,还有屏幕和计算机语言开拓的空间。看似平面的屏幕,似乎可以分为很多层。看似虚拟的世界,可以无限地叠加上形形色色的东西,自然是只在屏幕上出现。你可以发挥你的想象力,去获取、去构造各种信息,以及构建装载这些信息的窗口和容器。这个窗口和容器,虽然使用的是自然语言中的实体词汇,但远远超越了实体概念。也许真有一个新的哲学,来重新说明一下这个虚拟的空间。
这篇学习笔记就到这里吧。