Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用触摸屏显示调用和关闭Tkinter制作的虚拟键盘_Python_Tkinter - Fatal编程技术网

Python 如何使用触摸屏显示调用和关闭Tkinter制作的虚拟键盘

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):

我在打开和关闭用Tkinter制作的虚拟键盘时遇到问题。我正在创建一个GUI,用户将使用触摸屏显示进行浏览,用户需要输入条目

我尝试了
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()