Python 如何使用触摸屏显示调用和关闭Tkinter制作的虚拟键盘
我在打开和关闭用Tkinter制作的虚拟键盘时遇到问题。我正在创建一个GUI,用户将使用触摸屏显示进行浏览,用户需要输入条目 我尝试了Python 如何使用触摸屏显示调用和关闭Tkinter制作的虚拟键盘,python,tkinter,Python,Tkinter,我在打开和关闭用Tkinter制作的虚拟键盘时遇到问题。我正在创建一个GUI,用户将使用触摸屏显示进行浏览,用户需要输入条目 我尝试了var\u name.bind('FocusIn',callback)调用虚拟键盘,并var\u name.bind('FocusOut',callback)关闭虚拟键盘,但当我同时使用这两个键时,虚拟键盘会立即打开然后关闭 我希望你们能帮我这是我的代码: import tkinter as tk def select(entry, value, event):
var\u name.bind('FocusIn',callback)
调用虚拟键盘,并var\u name.bind('FocusOut',callback)
关闭虚拟键盘,但当我同时使用这两个键时,虚拟键盘会立即打开然后关闭
我希望你们能帮我这是我的代码:
import tkinter as tk
def select(entry, value, event):
focused_entry.insert("end", event)
pyautogui.press(event)
global uppercase
uppercase = False
if value == "Space":
value = ' '
elif value == 'Enter':
value = '\n'
elif value == 'Tab':
value = '\t'
if value == "Backspace":
if isinstance(entry, tk.Entry):
entry.delete(len(entry.get())-1, 'end')
#elif isinstance(entry, tk.Text):
else: # tk.Text
entry.delete('end - 2c', 'end')
elif value in ('Caps Lock', 'Shift'):
uppercase = not uppercase # change True to False, or False to True
else:
if uppercase:
value = value.upper()
entry.insert('end', value)
return
def create(root, entry):
alphabets = [
['`','1','2','3','4','5','6','7','8','9','0','-','=','Backspace'],
['Tab','q','w','e','r','t','y','u','i','o','p','[',']',"\\"],
['Caps Lock','a','s','d','f','g','h','j','k','l',';',"'",'Enter'],
['Shift','z','x','c','v','b','n','m',',','.','/','Shift'],
['Space']
]
global window
window = tk.Toplevel(root)
window.configure(background="cornflowerblue")
window.geometry("+0+483")
window.wm_attributes("-alpha", 0.7)
for y, row in enumerate(alphabets):
x = 0
#for x, text in enumerate(row):
for text in row:
if text in ('Enter', 'Shift'):
width = 18
columnspan = 2
elif text == 'Space':
width = 124
columnspan = 16
elif text == 'Backspace':
width = 10
columnspan = 1
elif text == '\\':
width = 10
columnspan = 1
elif text == 'Tab':
width = 10
columnspan = 1
elif text == '`':
width = 10
columnspan = 1
elif text == 'Caps Lock':
width = 10
columnspan = 1
else:
width = 4
columnspan = 1
tk.Button(window, text=text, width=width,
command=lambda value=text: select(entry, value),
padx=3, pady=3, bd=12, bg="black", fg="white", takefocus = False
).grid(row=y, column=x, columnspan=columnspan)
x+= columnspan
# --- main ---
def remember_focus(event):
global focused_entry
focused_entry = event.widget
if __name__ == '__main__':
root = tk.Tk()
root.title('Test Keyboard')
label = tk.Label(root, text='Test Keyboard')
label.grid(row=0, column=0, columnspan=2)
entry1 = tk.Entry(root)
entry1.grid(row=1, column=0, sticky='news')
entry1.bind("<FocusIn>", remember_focus)
entry2 = tk.Entry(root)
entry2.grid(row=2, column=0, sticky='news')
entry2.bind("<FocusIn>", remember_focus)
text1 = tk.Text(root)
text1.grid(row=3, column=0, sticky='news')
text1.bind("<FocusIn>", remember_focus)
root.mainloop()
将tkinter作为tk导入
def选择(条目、值、事件):
重点项目。插入(“结束”,事件)
pyautogui.press(事件)
全局大写
大写=假
如果值==“空格”:
值=“”
elif值=='Enter':
值='\n'
elif值=='Tab':
值='\t'
如果值==“退格”:
如果存在(条目,tk.条目):
entry.delete(len(entry.get())-1,“end”)
#elif isinstance(条目,tk.Text):
其他:#tk.Text
entry.delete('end-2c','end')
“大写锁定”、“Shift”中的elif值:
大写=不大写#将True更改为False,或将False更改为True
其他:
如果大写:
value=value.upper()
条目。插入('end',值)
返回
def create(根目录,条目):
字母表=[
['''、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'0'、'-'、'='、'Backspace'],
[Tab'、'q'、'w'、'e'、'r'、't'、'y'、'u'、'i'、'o'、'p'、'['、']'、“\\”],
[Caps Lock'、'a'、's'、'd'、'f'、'g'、'h'、'j'、'k'、'l'、';'、“'、”Enter'],
[Shift'、'z'、'x'、'c'、'v'、'b'、'n'、'm'、'、'、'、'、'/'、'Shift'],
[“空间”]
]
全局窗口
窗口=tk.Toplevel(根)
window.configure(background=“cornflowerblue”)
窗几何(“0+483”)
wm_属性(“-alpha”,0.7)
对于y,枚举中的行(字母):
x=0
#对于x,枚举(行)中的文本:
对于第行中的文本:
如果文本输入('Enter','Shift'):
宽度=18
columnspan=2
elif text==“空格”:
宽度=124
columnspan=16
elif text==“退格”:
宽度=10
columnspan=1
elif text=='\\':
宽度=10
columnspan=1
elif text==“选项卡”:
宽度=10
columnspan=1
elif text=='`':
宽度=10
columnspan=1
elif text==“大写锁定”:
宽度=10
columnspan=1
其他:
宽度=4
columnspan=1
按钮(窗口,文本=文本,宽度=宽度,
命令=lambda值=文本:选择(输入,值),
padx=3,pady=3,bd=12,bg=“黑色”,fg=“白色”,takefocus=False
).grid(行=y,列=x,列span=columnspan)
x+=柱跨度
#---梅因---
def记忆焦点(事件):
全球聚焦的项目
聚焦项=event.widget
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
root.title('测试键盘')
label=tk.label(根,text='Test Keyboard')
label.grid(行=0,列=0,列span=2)
entry1=tk.Entry(根)
entry1.grid(行=1,列=0,sticky='news')
entry1.bind(“,记住焦点)
entry2=tk.Entry(根)
entry2.grid(行=2,列=0,sticky='news')
entry2.bind(“,记住焦点)
text1=tk.Text(根)
text1.grid(行=3,列=0,sticky='news')
text1.bind(“,记住焦点)
root.mainloop()
感谢@furas先生帮助我创建虚拟键盘。
我编辑了代码,并在这里尝试了布莱恩·奥克利的答案
问题:使用触摸屏屏幕呼叫并关闭虚拟键盘
不要调用并关闭虚拟键盘,只需实例化一次虚拟键盘,然后使用顶级
方法.deiconify()
和退出()
不要将事件''
绑定到每个输入小部件,使用bind\u all(…
)绑定到应用程序级别
参考:
-
使用
bind\u all
创建绑定以在应用程序级别处理事件
-
将事件绑定添加到应用程序级别
核心点:
- 使用
.bind_all(“”,
到.deiconify()
- 使用
.bind_all(“”,
到.draw()
用Python测试:3.5-“TclVersion”:8.6“TkVersion”:8.6将示例代码剥离到一个空的tk.Frame
,以显示您的尝试。问题可能在于您的命令
。实际上,如果您发布了一个最小的代码示例,人们可以更容易地解决您的问题。@DaniyalAhmad OP simple希望在事件''
根目录下对顶级目录进行去锥形化。它是否应该是root=super()。\uuuu init\uuuu()
# VKeyboard.py
import tkinter as tk
class VKeyboard(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
# Don't show the 'Toplevel' at instantiation
super().withdraw()
self.create()
# Process all application == parent events
parent.bind_all('<FocusIn>', self.on_event, add='+')
parent.bind_all('<Button-1>', self.on_event, add='+')
def on_event(self, event):
w = event.widget
# Don't process the own Button
if w.master is not self:
w_class_name = w.winfo_class()
if w_class_name in ('Entry',):
if self.state() == 'withdrawn':
self.deiconify()
self.entry = w
elif w_class_name in ('Button',):
super().withdraw()
w.focus_force()
def create(self):
# define the virtual keyboard `tk.Button`
pass
import tkinter as tk
from VKeyboard import VKeyboard
class Kiosk(tk.Tk):
def __init__(self):
super().__init__()
VKeyboard(self)
tk.Entry(root).grid()
tk.Button(root, text='withdraw').grid()
if __name__ == "__main__":
Kiosk().mainloop()