文章续 Python GUI:Tkinter——02
常用的MessageBox
Python GUI:Tkinter——02的末尾曾经讲过弹窗。如何弹窗?就是下面的内容。MessageBox 常用的有4种, showinfo、showwarning、showerror、showerror,用法如下:
下面的代码是为了生成独立的出窗口。一般情况下,不用 root 这句代码。
from tkinter import messagebox as mBox
import tkinter as tk
root = tk.Tk()
root.withdraw()
mBox.showinfo('','A Python GUI created using tkinter:\n \
The year is 2015')
mBox.showwarning('warning','hhhhaa')
mBox.showerror('error','Error')
answer = mBox.askyesno('Is Right','You are a Pig?')
print(answer) #True of False
这个是单独使用的 MessageBox 代码。当然,也可以用作某个控件的 command 函数,来展示以上窗口。这些窗口除了前三个之外,最后一个可以将结果(yes no)输出给一个参数。这个参数的取值为 True 或者 False
我们给 clickBut 函数加点料,让别人在点击按钮的时候,弹出一个可爱的对话框吧:
.......
def clickBut():
aButton.configure(text='hello'+etyVar.get()+comVar.get())
mBox.showerror('错误提示框','你没有错,是我错了')
......
效果:
点击了 clickme 按钮之后,就会弹出如下对话框:
修改左上角的图标
Python GUI:Tkinter——02曾经提到,如何修改我们的 ICON 或者说 logo 呢?如何把标题栏上的讨厌羽毛弄掉呢?一句就够了,是的一句:
win.iconbitmap(r'../xxx.ico')
即可
这里推荐一个 icon 的下载链接:点我
随便下载一个后,就可以用上述代码把讨人厌的羽毛给换掉了,咔咔咔~
......
win = tk.Tk()
win.title('标题')
win.iconbitmap(r'../app.ico') #我把下载过来的 icon 文件更名为 app.ico 了
......
但是有一个问题,就是 MessageBox 弹出来的对话框中,其 icon 还是讨人厌的羽毛?怎么办呢?评论区回答一下吧。
给 ScrolledText 插入字符串
ScrolledText 控件(见01)能够很好的展示字符串。所以,根据代码自动地在里面插入字符串,从而起到展示的效果,这个功能很重要。怎么弄呢?
scr.insert(tk.INSERT, xxx)
即可,其中 scr 是 ScrolledText 对象
重磅:OOP之提示框
这个是这一章最有养分的地方了。在这一节,我们将实现一个提示框。当然,如果能记就记住代码吧。实在不行,如果有用到,回来我的博客复制便是。按照惯例,首先来看一下效果。
这里实现的是,只要把鼠标停留在相应的控件中,就会出现黄色的提示框。这个提示框是 tkinter 没有的,现在我们就自己实现一个!!
代码
先是代码文件,为了重复使用这段代码,我们把他命名为 tooltips.py:然后码上:
import tkinter as tk
class Tooltip():
def __init__(self,widget):
self.widget = widget
self.tipwindow = None #这个 tipwindow 就是图中的黄色框,我们用 tk.TopLevel 实现,具体请向下看!
self.id = None #这个暂时没用
self.x = self.y = 0 #这个决定了框框的大小和位置
def showtip(self,text):
self.text = text
if self.tipwindow or not self.text:
#如果已经有 window 或者 没文本 就返回
return
#showtip 用于创建 tipwindow 同时显示 text
x,y,_cx,cy = self.widget.bbox("insert")
#获取坐标(输入的地方)。其中_cx 表示不用
x = x + self.widget.winfo_rootx()+27
y = y + cy + self.widget.winfo_rooty()+27
self.tipwindow = tw = tk.Toplevel(self.widget)
# toplevel 可以看成一个 frame 或者 win,其中 widget表明:
# 这个 frame 长在 widget 上面
tw.wm_overrideredirect(1) #暂时不清楚
tw.wm_geometry("+%d+%d"%(x,y))
#前面两句可能是为了显示 toplevel,并设置其大小
label = tk.Label(tw,text=self.text,justify=tk.LEFT,
background='#ffffe0',relief=tk.SOLID,
borderwidth=1,font=('tahma',"8","normal"))
label.pack(ipadx=1) #放置label
def hidetip(self):
"""销毁"""
tw = self.tipwindow
self.tipwindow = None #将变量指向None对象
if tw:
tw.destroy()
def createToolTip(widget,text):
aTooltip = Tooltip(widget) #实例化一个对象
def enter(event): #定义一个鼠标事件触发函数
aTooltip.showtip(text)
def leave(event):
aTooltip.hidetip()
widget.bind('<Enter>',enter) #给控件绑定一个鼠标事件
widget.bind('<Leave>',leave)
实现
有了 tooltips.py 后,我们就可以在我们想要创建提示框的控件中,加入如下语句:
.......
from tkinter import scrolledtext #承接第二章的代码
scrW = 30
scrH = 3
aScrTxt = scrolledtext.ScrolledText(zhuo,height=scrH,width=scrW,wrap=tk.WORD)
aScrTxt.grid(row=4,column=0,columnspan=3)
from tooltips import * #首先导入模块,请把 tooltips.py 文件放置到同一文件夹下
createToolTip(aScrTxt,'I am a scrolledtext, I was created by zhuo muniao') #给控件 aScrTxt 绑定一个提示框。
.......
新控件—— spinbox
spinbox 何许人也?这个控件隶属与 tk 而不是 ttk。它能够上下调制输出的值,也支持用户自己输入值。属于一个比较冷门,但也常用的控件,他长得怎么样呢?靓仔!!你可能已经在上幅图中看过了,没错,它就出现在最底下的角落,那个最靓的仔!
看见了吧,长这样。其代码如下:
......
from tkinter import Spinbox
aSpinbox = Spinbox(aLabelFrame,from_=0,to=10,state='readonly') #更改 state 就可以允许可写
# aSpinbox = Spinbox(aLabelFrame,values=(1,2,5,10)) #也可以用 value 参数来设置
"""也可以用 value 来修改"""
# aSpinbox = Spinbox(aLabelFrame)
# aSpinbox['value'] = (1,2,5,10)
aSpinbox.grid(column=0,row=3)
......
如果用 from_,to 参数来设置,就是自然序列。如果是用 values 参数来设置,就不是咯!
总结
依照惯例,我们对本章做一个总结。这一章最爆料的,就是完善了一个提示框了吧。当然,也对我们的 GUI 进行了一次小修小补,使他看起来更加美丽动人了。
相信大家已经跃跃欲试,想要开发自己的 GUI 了。但请不要这样子做,因为我们先前的打码方式,只是写笔记的方式,用来开发一个大型的 GUI 或者一般中等的 GUI,是十分吃力的。
在第二章的末尾,我们提到了一个非常难以解决的问题:变量命名。别小看他,如果代码量大了,我们又无法把他弄成两个 .py 文件(上一章解释了),那么等待这我们的,将会是让我们头皮发麻的代码维护工作。因此,咱们暂且压制我们开发 GUI 的心情。
如何解决呢?请看下一章 Python GUI:Tkinter——04