在自定义Python tkinter程序中建立BackSpace和Enter函数

时间:2018-04-28 12:22:30

标签: python python-3.x tkinter

我在python 3 Tkinter窗口上构建了一个模拟器程序。由于我自己构建的输入程序中的错误,进展现在已经中断。

我现在正在处理的破碎代码:

from tkinter import *
root = Tk()
prompt = '      Press any key      '
label1 = Label(root, text=prompt, bg='black', fg='green')
label1.grid(row=0, column=0)
prompt2=''
def key(event):
    global prompt2
if event.char == event.keysym:
    prompt2 = prompt2 + event.char
elif len(event.char) == 1:
    prompt2 = prompt2 + event.char
else:
    pass
label1.config(text=prompt2)
root.bind_all('<Key>', key)
root.update()
root.mainloop()

所以,我想做的(并尝试做)是:

  1. 构建一个允许用户使用BackSpace并阻止他们使用Enter的功能(因为我不希望他们移动到新行)。
  2. 将变量设置为True,为程序提供何时开始(接受输入)和何时停止的信号。
  3. 但我似乎无法做到这一点。有关1或2的任何建议吗?请在评论部分告诉我。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

为什么要将event.charevent.keysym进行比较?对于可打印字符,它始终为True,对于字符序列和特殊字符(如),始终为False

这个怎么样(未经测试的)?

import string
import tkinter as tk
# See side note 1

def key_event(label, event):
    label_text = label.cget("text")
    if event.keysym == "backspace":
        label.config(text=label_text[:-1])
    elif event.keysym == "return":
        # Disallow 'return'
        pass
    elif event.char in string.ascii_lowercase:
        # Character is an ASCII letter
        label.config(text=label_text + event.char)

def main():
    root = tk.Tk()
    prompt = "      Press any key      "
    label = tk.Label(root, text=prompt, bg="black", fg="green")
    label.grid(row=0, column=0)
    label.bind("<Key>", lambda e: key_event(label, e))
    # See side note 2
    label.focus()
    # Give keyboard focus
    root.mainloop()

附注1:避免使用通配符导入(from ... import *)。相反,将tkinter'别名为“tk

import tkinter as tk
root = tk.Tk()
...

附注2:避免使用全局变量,更喜欢使用类(如果您知道如何正确使用它们,请参阅下面的部分示例),或者对于非常小的代码片段,使用像我这样的lambdas共享变量。

import string
import tkinter as tk


class EditableLabel(tk.Label):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.bind("<Key>", self._key_event)

    def _key_event(self, event):
        keysym, char = event.keysym, event.char
        text = self.cget("text")
        if keysym == "backspace":
            self.config(text=text[:-1])
        elif keysym == "return":
            pass
        elif char in string.ascii_lowercase + string.digits:
            self.config(text=text + char)


class MyApplication(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._add_and_draw_widgets()

    def _add_and_draw_widgets(self):
        for i in range(3):
            EditableLabel(self, text="Label #{}".format(i)).grid(column=0, row=i)


def main():
    root = tk.Tk()
    app = MyApplication(root)
    app.grid(column=0, row=0)
    root.mainloop()

if __name__ == "__main__":
    main()