尽管python提供了多个消息框已经能够满足大部分正常人的需求,但并不够灵活,所以有的时候不得不自定义消息框。
新建窗口消息框的本质是一个窗口、一段信息,外加两个按钮
import tkinter as tkfont= ("微软雅黑", 20)def msgbox(txt, yesfunc=none, nofunc=none): win = tk.tk() win.title("started") win.geometry("400x200+300+100") label = tk.label(win,text=txt, font=font) label.pack(side=tk.top,expand=tk.yes,fill=tk.both) btnyes = tk.button(win, text="是", width=8, font=font, command = lambda : yesfunc(win)) btnyes.pack(side=tk.left,expand=tk.yes,fill=tk.y) btnno = tk.button(win, text="否", width=8,font=font) btnno.bind("<enter>", lambda evt: nofunc(evt, win)) btnno.pack(side=tk.right,expand=tk.yes,fill=tk.y)msgbox("你是不是喜欢我?")
font是一个全局变量,表示字体及其大小,在label和button创建的时候,会通过font参数进行设置。
pack是一种布局方式,顾名思义,就是打包。如果把窗口想象成是一个箱子,那么打包肯定是哪里有空打哪里。比如最下面放了一层衣服,没地方放了只能放在第二层;如果第二层只放了一个砖头,那么其他位置还有空间,于是可以贴着砖头再放一个砖头。
在上面的案例中,将label从上面压下来,然后下面左右两侧分别放置一个按钮。
其中,无论是还是否,都需要对窗口进行操作,所以回调函数使用了lambda表达式,从而能够对窗口进行操作。<enter>表示当鼠标浮动在组件上方时响应,其回调函数需要输入一个参数evt。
效果如下
关闭窗口接下来写是的逻辑,即关闭现有窗口后,弹出一个新的窗口,新的窗口只需要有一个
def yesfunc(win): x, y = win.winfo_x(), win.winfo_x() win.destroy() win = tk.tk() win.geometry(f"400x200+{x}+{y}") txt = "放学去房后小树林\n不见不散\n嘿嘿嘿" label = tk.label(win,text=txt, font=font) label.pack(side=tk.top,expand=tk.yes,fill=tk.both) btn = tk.button(win, text="好的呀", width=12, font=font, command=lambda:win.destroy()) btn.pack(side=tk.top)msgbox("你是不是喜欢我?", yesfunc)
destroy即关闭当前窗口。在当前窗口被关闭后,在原来窗口的位置处新建一个窗口,win_winfo_x, win_winfo_y用于获取窗口位置。
效果如下
挪动窗口然后写否的逻辑,当鼠标悬浮在否的按钮上时,挪动窗口的位置。由于
import randomdef randint(a, b): r = random.randint(-a, a) while abs(r) < abs(b): r = random.randint(-a, a) return rdef nofunc(evt, win): x, y = win.winfo_x(), win.winfo_x() x += randint(100, 80) y += randint(30, 20) win.geometry(f"400x200+{x}+{y}")msgbox("你是不是喜欢我?", yesfunc, nofunc)
通过geometry函数,不仅可以再创建窗口的时候声明窗口位置,而且可以随时随地修改窗口的位置。这样一来,当鼠标浮动在否按钮上的时候,甚至还没点击,窗口就躲开了。
效果如下
以上就是怎么使用python+tkinter编写一个强制表白神器的详细内容。