以下代码生成具有单个Entry
小部件的应用。当使用Homebrew的Python 3.7.3在MacOS上运行时,在输入框中按下向上或向下箭头会导致插入字符0xF701:
import tkinter as tk
root = tk.Tk()
app = tk.Frame(master=root)
app.pack()
entry = tk.Entry(app)
entry.pack()
app.mainloop()
Anaconda Python不会发生这种情况,而且我找不到其他遇到此问题的人。
通过将print
绑定到上下事件,我已经看到与这些事件关联的字符确实是0xF700
和0xF701
。
entry.bind('<Down>', print)
entry.bind('<Up>', print)
上下按下后输出:
<KeyPress event state=Mod3|Mod4 keysym=Up keycode=8320768 char='\uf700' delta=8320768 x=-5 y=-50>
<KeyPress event state=Mod3|Mod4 keysym=Down keycode=8255233 char='\uf701' delta=8255233 x=-5 y=-50>
使用Anaconda Python版本时,输出略有不同:
<KeyPress event state=Mod3|Mod4 keysym=Up keycode=8320768 char='\uf700' x=-5 y=-50>
<KeyPress event state=Mod3|Mod4 keysym=Down keycode=8255233 char='\uf701' x=-5 y=-50>
有人知道这个问题的简单解决方案吗?
答案 0 :(得分:1)
可以验证输入帮助吗?以下代码验证了Entry中的结果字符串仅包含valid_chars
中的字符。如果需要,可以编写更复杂的验证规则。
import tkinter as tk
import re
valid_chars = re.compile(r'^[0-9A-Za-z ]*$') # Accept Alphanumeric and Space
class ValidateEntry(tk.Entry):
def __init__(self, parent, regex):
self.valid = regex
validate_cmd = (parent.register(self.validate),'%P') # %P pass the new string to validate
super().__init__( parent, validate = 'key', validatecommand = validate_cmd)
# validate = 'key' runs the validation at each keystroke.
def validate(self, new_str):
if self.valid.match(new_str): return True
return False
def do_key(ev):
print(ev.widget, ev, entry.get())
root= tk.Tk()
root.title("Validation")
fram = tk.Frame(root)
fram.grid()
entry = ValidateEntry(fram, valid_chars)
entry.grid()
entry.bind('<Down>', do_key)
entry.bind('<Up>', do_key)
root.mainloop()
这可能有点过分,但应该可以在所有平台上使用。
答案 1 :(得分:1)
之所以发布Entry
小部件中那些未知字符,是因为出于某些原因“ Up” (\ uf700)和“ Down” < / em>(\ uf701)从自制python运行时,箭头会打印
,但不能与anaconda python一起运行时,箭头会打印root = Tk()
E = Entry(root)
E.bind('<Key>', lambda e: print(e.char))
E.pack()
root.mainloop()
。
您可以通过与任何一个运行此代码来尝试看看自己。
<Key>
我想出的解决方案是覆盖Entry
小部件的主要import tkinter as tk
class Entry(tk.Entry):
def __init__(self, master=None, cnf={}, **kw):
super(Entry, self).__init__(master=master, cnf=cnf, **kw)
self.bind_class('Entry', '<Key>', self.add_char)
def add_char(self, evt):
if evt.char != '\uf701' and evt.char != '\uf700':
self.insert('insert', evt.char)
self.xview_moveto(1)
if __name__ == "__main__":
root = tk.Tk()
E = Entry(root)
E.pack()
root.mainloop()
绑定,以忽略“ Up” 和“ Down” 箭头。
{{1}}