在pythonguizero/tkinter中如何处理none字母键盘输入错误?
How to deal with none letter keyboard input errors in python guizero/tkinter?
当我按下 Tab 键时,它会选择输入框中的所有文本,除非我将输入框多行设置为 true,但它最终会给第一个 post 一个奇怪的格式。我希望 tab 键像在任何其他程序中一样正常工作。当我在 shell 中按 Shift 或 Caps lock 时,我也遇到错误
基于第一个键输入“if”语句是什么。 Shift 和 Caps lock 仍然最终使文本显示正确。
我尝试添加 if 语句来避免 Tab 键错误,但它似乎不起作用。我尝试使用 pass 和一个普通的打印语句。
我在用什么。
- Python 3.7.9
- Thonny IDE 3.3.4
- Guizero 基于 tkinter。
- ASCII table key numbers
我收到错误
if ord(e.key) == 9: #tab key
TypeError: ord() expected a character, but string of length 0 found
from guizero import *
app = App(bg='#121212',title='Virtual assistant',width=500,height=500)
box=Box(app,width='fill',height=420)
box.bg='light gray'
Spacer_box=Box(box,width='fill',height=5,align='top')
userName='Test Username: '
#A is set as the default text value to test if posting into the box works
#Setting multiline to true changes the first post format but allows for the tab key to work properly
input_box = TextBox(app,text='A',width='fill',multiline=False,align="left")
input_box.text_size=15
input_box.bg='darkgray'
input_box.text_color='black'
input_box.tk.config(highlightthickness=5,highlightcolor="black")
def key_pressed(e):
#stop tab key from highlighting text only when input_box multiline is set to true
#in the input_box above
if ord(e.key) == 9: #Tab key
print('Tab pressed')
elif ord(e.key) == 13:#Enter key
#Checks if input box is blank or only white space.
if input_box.value.isspace() or len(input_box.value)==0:
print('Empty')
input_box.clear()
else:#User's output.
Textbox=Box(box,width='fill', align='top')
Usernamers=Text(Textbox, text=userName,align='left')
Usernamers.tk.config(font=("Impact", 14))
User_Outputted_Text = Text(Textbox, text=input_box.value,size=15,align='left')
print('Contains text')
input_box.clear()
#Test responce to user
if User_Outputted_Text.value.lower()=='hi':
Reply_box=Box(box,width='fill',align='top')
Digital_AssistantName=Text(Reply_box,text='AI\'s name:',align='left')
Digital_AssistantName.tk.config(font=("Impact", 14))
Reply_text = Text(Reply_box,text='Hello, whats up?',size=15,align='left')
input_box.when_key_pressed = key_pressed
app.display()
在 key_pressed
函数的开头添加这个将消除 Caps Lock/Shift 或任何键时的错误returns 按下了一个空字符串。
if e.key=='':
return
以下内容可防止 Tab 键选择文本
if ord(e.key) == 9: #Tab key
print('Tab pressed')
input_box.append(' '*4)
input_box.disable()
input_box.after(1,input_box.enable)
基本上我禁用了小部件,然后在 1
毫秒后启用它。
更新
另一种方法是将 Tab 键绑定到内部使用的 Entry
小部件(可以使用 tk
属性 如 docs 中所述)。我会推荐这种方法而不是以前的方法,因为 append
方法在末尾添加文本,没有内置方法在当前位置插入文本,所以你最终会使用 insert
tkinter.Entry
的方法,索引为 'insert'
.
def select_none(event):
input_box.tk.insert('insert',' '*4)
return 'break'
input_box.tk.bind('<Tab>',select_none)
在函数末尾使用 return 'break'
可防止执行其他事件处理程序。
当我按下 Tab 键时,它会选择输入框中的所有文本,除非我将输入框多行设置为 true,但它最终会给第一个 post 一个奇怪的格式。我希望 tab 键像在任何其他程序中一样正常工作。当我在 shell 中按 Shift 或 Caps lock 时,我也遇到错误 基于第一个键输入“if”语句是什么。 Shift 和 Caps lock 仍然最终使文本显示正确。
我尝试添加 if 语句来避免 Tab 键错误,但它似乎不起作用。我尝试使用 pass 和一个普通的打印语句。
我在用什么。
- Python 3.7.9
- Thonny IDE 3.3.4
- Guizero 基于 tkinter。
- ASCII table key numbers
我收到错误
if ord(e.key) == 9: #tab key TypeError: ord() expected a character, but string of length 0 found
from guizero import *
app = App(bg='#121212',title='Virtual assistant',width=500,height=500)
box=Box(app,width='fill',height=420)
box.bg='light gray'
Spacer_box=Box(box,width='fill',height=5,align='top')
userName='Test Username: '
#A is set as the default text value to test if posting into the box works
#Setting multiline to true changes the first post format but allows for the tab key to work properly
input_box = TextBox(app,text='A',width='fill',multiline=False,align="left")
input_box.text_size=15
input_box.bg='darkgray'
input_box.text_color='black'
input_box.tk.config(highlightthickness=5,highlightcolor="black")
def key_pressed(e):
#stop tab key from highlighting text only when input_box multiline is set to true
#in the input_box above
if ord(e.key) == 9: #Tab key
print('Tab pressed')
elif ord(e.key) == 13:#Enter key
#Checks if input box is blank or only white space.
if input_box.value.isspace() or len(input_box.value)==0:
print('Empty')
input_box.clear()
else:#User's output.
Textbox=Box(box,width='fill', align='top')
Usernamers=Text(Textbox, text=userName,align='left')
Usernamers.tk.config(font=("Impact", 14))
User_Outputted_Text = Text(Textbox, text=input_box.value,size=15,align='left')
print('Contains text')
input_box.clear()
#Test responce to user
if User_Outputted_Text.value.lower()=='hi':
Reply_box=Box(box,width='fill',align='top')
Digital_AssistantName=Text(Reply_box,text='AI\'s name:',align='left')
Digital_AssistantName.tk.config(font=("Impact", 14))
Reply_text = Text(Reply_box,text='Hello, whats up?',size=15,align='left')
input_box.when_key_pressed = key_pressed
app.display()
在 key_pressed
函数的开头添加这个将消除 Caps Lock/Shift 或任何键时的错误returns 按下了一个空字符串。
if e.key=='':
return
以下内容可防止 Tab 键选择文本
if ord(e.key) == 9: #Tab key
print('Tab pressed')
input_box.append(' '*4)
input_box.disable()
input_box.after(1,input_box.enable)
基本上我禁用了小部件,然后在 1
毫秒后启用它。
更新
另一种方法是将 Tab 键绑定到内部使用的 Entry
小部件(可以使用 tk
属性 如 docs 中所述)。我会推荐这种方法而不是以前的方法,因为 append
方法在末尾添加文本,没有内置方法在当前位置插入文本,所以你最终会使用 insert
tkinter.Entry
的方法,索引为 'insert'
.
def select_none(event):
input_box.tk.insert('insert',' '*4)
return 'break'
input_box.tk.bind('<Tab>',select_none)
在函数末尾使用 return 'break'
可防止执行其他事件处理程序。