Python ttkbootstrap 在Mac上使用Querybox弹出输入框后Entry不能输入的问题
最近在Mac上写工具有使用到弹出输入框,且用的是ttkbootstrap,在写的过程中发现使用了Querybox的get_string()后,不管是点击关闭按钮还是Cancel和Submit按钮将弹出输入框关闭了之后,界面上的Entry居然输入不了,一开始以为被设置了readonly状态,后面经过测试发现不是这个问题,就很烦。然后发现ttk的askstring()这个弹出输入框是可以的,但是它确实没那么好看,那既然知道了它可以,就好办了。
1、使用弹出输入框之前,Entry状态
现在的Entry是可以输入的
.
.
.
正常没有调用Querybox.get_string()前的效果:
2、使用弹出输入框
Querybox.get_string()效果
.
.
.
3、关掉弹出输入框后,Entry状态
关掉之后Entry就成了只读状态,且修改成normal状态也不能输入
.
.
.
不能输入的Entry效果:
4、使用tkinter的askstring()
使用这个弹出输入框是可以让Entry正常输入,但是这个框的取消按钮是空白的
.
.
.
askstring()效果:
5、解决办法
既然askstring()可以,但是有缺陷,那我们就可以重写这个方法来解决
6、效果
使用以下例子完美解决!
效果图:
demo.py
import ttkbootstrap as ttk
from tkinter.simpledialog import _QueryDialog
# 编辑弹窗
class Edit(_QueryDialog):
def __init__(self, title, prompt):
_QueryDialog.__init__(self, title, prompt)
def body(self, master):
entry = _QueryDialog.body(self, master)
return entry
def buttonbox(self):
box = ttk.Frame(self)
w = ttk.Button(box, text="好了", width=10, command=self.ok, default='active')
w.pack(side='left', padx=5, pady=5)
w = ttk.Button(box, text="取消", width=10, command=self.cancel,bootstyle='secondary')
w.pack(side='left', padx=5, pady=5)
self.bind("<Return>", self.ok)
self.bind("<Escape>", self.cancel)
box.pack()
def getresult(self):
return self.entry.get()
def Change_text(text):
"""更改text内容"""
content = Edit('输入框弹窗demo','请输入内容:')
text.configure(text=content.result)
if __name__ == '__main__':
root = ttk.Window(themename='flatly')
root.title('输入框弹窗demo')
root.geometry("250x100")
text = ttk.Label(root,text='我是未更改的内容')
text.pack()
but = ttk.Button(root,text='点击更改',command=lambda:Change_text(text))
but.pack()
root.mainloop()