Python Tkinter GUI开发:从基础标签按钮到模态对话框实战
本文深入解析Python Tkinter图形界面开发,涵盖标签与按钮的自定义样式配置、顶层窗口协议处理及图标报错解决,并详细演示标准模态对话框(如询问、警告、错误提示)及多栏复合对话框的构建与回调逻辑,帮助开发者掌握GUI交互设计的核心技巧。
一、漂亮的标签图和按钮图
配置标签属性时,若熟悉Office软件的操作逻辑,这并非难事。我们可以仿照文本字体、颜色、字号以及标签的高度和宽度等参数,编写一个示例Python文件。该文件位于我的pywenjianjia目录下。
from tkinter import *
root = Tk()
labelfont = ('times', 28, 'bold')
widget = Label(root, text='Hello tkinter world, I came here!')
widget.config(bg='black', fg='yellow')
widget.config(font=labelfont)
widget.config(height=5, width=40)
widget.pack(expand=YES, fill=BOTH)
root.mainloop()
在Atom编辑器的packages中点击python runner执行该文件,即可看到运行效果。

若希望制作具有动态效果的按钮图片,可以使用button.py文件,同样通过仿制方式生成Python代码。
在from tkinter import *
widget = Button(text='BUTTON', padx=20, pady=20)
widget.pack(padx=30, pady=30)
widget.config(cursor='gumby')
widget.config(bd=8, relief=RAISED)
widget.config(bg='dark green', fg='white')
widget.config(font=('helvetica', 24, 'underline italic'))
mainloop()
在Atom编辑器的packages中点击python runner执行该文件,运行结果如下: 显示出一个美观、彩色且可点击的按钮图片。

二、窗口协议与窗口顶层
早年编写《创新思维》教材时,学习Visio绘图耗费了不少精力,当时对其在平面上的分层处理能力印象深刻。尽管屏幕仅提供平面视觉,却能绘制出各种复杂图形,并支持多层叠加及不同色彩配置。随着计算机技术的不断升级,许多曾经令人感到新奇的现象已逐渐被更先进的技术所超越。但在接触GUI图像时,仍需保持一份惊喜感,并了解其背后相应的协议机制。起初我以为“协议”是指超越GUI之外的某种约定,但实际上它也是由Python代码构成的GUI文件。 此外,该文件存在一个怪异之处:按照教材安排执行时,文件会显示错误。尝试多种方法后依然报错。回顾教材文本,在窗口图标章节似乎有相关暗示,最终尝试去掉iconbitmap代码行(即第18行代码),文件即可正常执行。
展示文件的注释带有一定的协议文本特征,这或许就是协议的主要内容。下面给出总共28行的代码文件。
"""
弹出三个窗口,destroy()会停止一个窗口,quit()则停止所有窗口.
顶层窗口有标题、图标、协议等等,总是会有一个应用程序窗口。顶
层窗口都是容器,但不会封装/网格化。toplevel就像frame,它是新
窗口且包含一个菜单。
"""
from tkinter import *
root = Tk() #显示根窗口
trees = [('The tkinter 之旅!', 'light blue'),
('The Paint!', 'light green'),
('The Giant wetearth !', 'red')]
for(tree, color) in trees:
win = Toplevel(root) #新建窗口
win.title('Sing...') #设置边框
win.protocol('WM_DELETE_WINDOW', lambda:None) #忽略关闭
win.iconbitmap('py-blue-trans-out.ico') #非红色Tk,有这一行则不运行
msg = Button(win, text=tree, command=win.destroy) #关闭一个win
msg.pack(expand=YES, fill=BOTH)
msg.config(padx=10, pady=10, bd=10, relief=RAISED)
msg.config(bg='black', fg=color, font=('times', 30, 'bold italic'))
root.title('Lumberjack demo')
Label(root, text='Main window', width=30).pack()
Button(root, text='Quit All', command=root.quit).pack() #终止所有程序
root.mainloop()
执行该文件后,出现以下结果:
Traceback (most recent call last):
File "C:\Users\zzx21\GUI\Tour\toplevel2.py", line 18, in <module>
win.iconbitmap('py-blue-trans-out.ico') #非红色Tk,有这一行则不运行
File "C:\Users\zzx21\pywenjianjia\lib\tkinter\__init__.py", line 2080, in wm_iconbitmap
return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "py-blue-trans-out.ico" not defined
C:\Users\zzx21\GUI\Tour>
现在去掉第18行代码,三个窗口按钮全部出现,并额外带有一个quit图标。使用shell移动提示符,可以将这些文件移动到屏幕上希望放置的位置,颇具趣味。

三、标准对话框是模态对话框
计算机语言常借用逻辑学术语,在tkinter之旅中提到的对话框,竟分为模态对话框和非模态对话框。这似乎在拉近Python语言与逻辑学的距离,令人感到一种缘分。只要对现代逻辑历史稍有了解,就会知道20世纪初成熟的现代逻辑在20年代出现了与经典逻辑有所变异的逻辑,即非经典的模态逻辑。美国学者C.I.刘易斯构造了严格蕴涵系统的S1-S5,由此产生了现在所称的模态逻辑,学名为modal logic。而对话框中提到的模态对话框与非模态对话框中的“模态”一词,英文正是modal。但深入分析,此处的modal与逻辑学中的modal并无实质关联,仅是用词上的巧合。 沿袭教材思路,先对标准对话框进行基本了解,大致能说明这种巧合。 标准对话框也称通用对话框,这类对话框也是模态的。此处modal的含义是:此类对话框会阻止其他界面操作,只有当用户关闭该对话框时,其他界面才可能恢复。因此,所谓标准对话框或模态对话框,只要它出现在屏幕上,就会强制遮挡其他窗口界面。为何称之为modal?按我对modal的理解,似乎毫无modal的含义。因为逻辑中的模态总是指互为定义的模态词,例如必然与可能、应该与禁止等,并不具备这里的行为意义。让我们通过实例中的模态对话框来表明其含义。虽然modal在此处的含义略显模糊,但实例的出现会消解我们的迷惑。很可能Python中的模态与逻辑学中的模态并非同一概念,仅是一种语词使用的巧合。 标准对话框dIg1.pyw代码示例如下:
from tkinter import *
from tkinter.messagebox import *
def callback():
if askyesno('Verify', 'Do you really want to quit?'):
showwarning('Yes', 'Quit not yet implemented')
else:
showinfo('No', 'Quit has been cancellled')
errmsg = 'Sorry, no Spam allowed!'
Button(text='退出', command=callback).pack(fill=X)
Button(text='垃圾', command=(lambda: showerror('Spam', errmsg))).pack(fill=X)
mainloop()
我用中文按钮替换英文按钮,生成了中文对话框。这些对话框按钮可点击并给出选择,如下两图所示。 点击“退出”按钮后,出现如下选择:

点击“垃圾”按钮后,出现如下选择:

四、标准对话框的多栏使用
首先创建一个回调演示表的py文件,该文件可作为模块反复使用,从而使对话框制作更加多样化。我依然将这些对话框的按钮用中文标识,然后创建一个多重按钮栏文件,于是看到一个功能更多的对话框图形。这是一个可以打开文件、选择颜色、输入字符等的对话框。虽然要完全理解所有代码的功能尚需时日,但最终可以照葫芦画瓢地显示出这些图框及其作用。 演示按钮集合的py文件demoDIg.py代码如下:
from tkinter import *
from dialogTable import demos
from quitter import Quitter
class Demo(Frame):
def __init__(self, parent=None, **options):
Frame.__init__(self, parent, **options)
self.pack()
Label(self, text='Basic demos').pack()
for (key, value) in demos.items():
Button(self, text=key, command=value).pack(side=TOP, fill=BOTH)
Quitter(self).pack(side=TOP, fill=BOTH)
if __name__=='__main__': Demo().mainloop()
执行该文件后,出现按钮栏对话框。

如果点击“打开”按钮,则打开了Windows文档文件。

如果点击“颜色”,则可在颜色框中选择颜色。

如果点击“输入”,则可在输入框中按要求输入数字。

对该对话框的初步理解,颇有点开人眼界。作为计算机科学中的Python语言,确实拥有超越自然语言的诸多功能。冲着这一点,即使这个编程语言再难,也得一点一点地坚持学下去。
到此这篇关于Python基础学习之奇异的GUI对话框的文章就介绍到这了,更多相关Python GUI对话框内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









