向上和向下箭头在tkinter.Entry小部件

时间:2019-05-27 04:37:12

标签: python-3.x macos tkinter

以下代码生成具有单个Entry小部件的应用。当使用Homebrew的Python 3.7.3在MacOS上运行时,在输入框中按下向上或向下箭头会导致插入字符0xF701:

Down key introduces character

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绑定到上下事件,我已经看到与这些事件关联的字符确实是0xF7000xF701

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>

有人知道这个问题的简单解决方案吗?

2 个答案:

答案 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}}