在另一个 python 程序中使用虚拟键盘输入条目 [英] Typing on entry using virtual keyboard in another python program

查看:26
本文介绍了在另一个 python 程序中使用虚拟键盘输入条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在输入 Tkinter 条目时遇到问题.我做了一个注册码,我的代码上的每个条目都调用了一个虚拟键盘,虚拟键盘是分开的python程序.我成功调用了另一个 python 程序,但我无法使用我调用的虚拟键盘在我的 Tkinter 条目上输入,这是我的主程序.有什么办法可以做到这一点吗?这是我的代码

 def register(self):self.master_register = Toplevel()self.first_name = StringVar()self.middle_name = StringVar()self.last_name = StringVar()self.sex = StringVar()self.birth_day = StringVar()self.civil_status = StringVar()self.label_head = Label(self.master_register, text = "请填写以下所有信息")self.label_head.pack()self.label_first_name = Label(self.master_register, text = "First Name")self.label_first_name.pack()self.entry_first_name = Entry(self.master_register, textvariable = self.first_name)self.entry_first_name.pack()self.entry_first_name.bind('',self.keyboard)self.label_middle_name = Label(self.master_register, text = "Middle Name")self.label_middle_name.pack()self.entry_middle_name = Entry(self.master_register, textvariable = self.middle_name)self.entry_middle_name.pack()self.entry_middle_name.bind('',self.keyboard)self.label_last_name = Label(self.master_register, text = "Last Name")self.label_last_name.pack()self.entry_last_name = Entry(self.master_register, textvariable = self.last_name)self.entry_last_name.pack()self.entry_last_name.bind('',self.keyboard)self.label_sex = Label(self.master_register, text = "Sex")self.label_sex.pack()self.radio_button_sex1 = Radiobutton(self.master_register, text = "Male", variable = self.sex, value = "Male" )self.radio_button_sex1.pack()self.radio_button_sex2 = Radiobutton(self.master_register, text = "Female", variable = self.sex, value = "Female")self.radio_button_sex2.pack()self.label_birthday = Label(self.master_register, text = "生日")self.label_birthday.pack()self.entry_birthday = Entry(self.master_register, textvariable = self.birth_day)self.entry_birthday.pack()self.entry_birthday.bind('',self.keyboard)self.label_civil_status = Label(self.master_register, text = "Civil Status")self.label_civil_status.pack()self.entry_civil_status = Entry(self.master_register, textvariable = self.civil_status)self.entry_civil_status.pack()self.entry_civil_status.bind('',self.keyboard)self.button_submit = Button(self.master_register, text = "Submit", command = lambda: self.registered(self.first_name, self.middle_name,self.last_name, self.sex, self.birth_day,self.civil_status))self.button_submit.pack()定义键盘(自我,事件):exec(open("keyboardclass.py").read());

这是我的键盘类.py

def select(value):如果值==空格":entry1.insert(tkinter.END, ' ')elif 值 ==退格":entry1.delete(len(entry1.get())-1,tkinter.END)别的:entry1.insert(tkinter.END,值)根 = Tk()root.configure(background = "cornflowerblue")root.wm_attributes("-alpha", 0.7)字母 = ['`','1','2','3','4','5','6','7','8','9','0','-','=','<-退格','Tab','q','w','e','r','t','y','u','i','o','p','[',']',"\\",'Caps Lock','a','s','d','f','g','h','j','k','l',';',"'",'进入','Shift','z','x','c','v','b','n','m',',','.','/','Shift','空间']行 = 2列 = 0对于字母表中的字母表:命令 = lambda x=字母:选择(x)如果字母 != '空格':按钮(根,文本 = 字母,command = command,width = 5, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column)如果字母 == '回车':按钮(根,文本 = 字母,command = command, width = 15, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column, columnspan = 2)如果字母 == 'Shift':按钮(根,文本 = 字母,command = command, width = 15, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column, columnspan = 2)如果字母 == '空格':按钮(根,文本 = 字母,command = command, width = 130, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = 6, columnspan = 16)列 +=1如果列>13 和行 == 1:列 = 0行 += 1如果列>13 和行 == 2:列 = 0行 +=1如果列>13 和行 == 3:列 = 0行 +=1如果列>12 和行 == 4:列 = 0行 +=1

root.mainloop()

解决方案

keyboard.py

我将代码放在函数 create() 中,它获取 rootentry 作为参数 - 所以现在我可以使用 import 键盘 其他文件并运行 keyboard.create(root, some_entry).

它使用 root 创建窗口 Toplevel() 而不是 Tk() - 并且没有第二个 mainloop()代码>.

它使用 entryselect(entry, value) 中使用它,这将使用 entry.insert(...)

if __name__ == "__main__" 中有代码:因此您可以将其作为独立程序运行以测试键盘.

它显示两个Entry和一个Text(您可以在其中测试键Enter).

我为EnterTabBackspace 添加了Text 的代码(这需要不同的方法).当您按 ShiftCaps Lock 时,它会开始插入大写字符 - 但它不会更改窗口中按钮上的文本.

alphabets 中我将行分组到列表中,所以我不需要 if/else 来检查字符是否应该在下一行 - 我可以使用两个 for-循环.

<小时>

导入 tkinter 作为 tk字母 = [['`','1','2','3','4','5','6','7','8','9','0','-','=','退格'],['Tab','q','w','e','r','t','y','u','i','o','p','[',']',"\\"],['Caps Lock','a','s','d','f','g','h','j','k','l',';',"'",'进入'],['Shift','z','x','c','v','b','n','m',',','.','/','Shift'],['空间']]uppercase = False # 使用大写字符.定义选择(条目,值):全局大写如果值==空格":值 = ' 'elif 值 == '回车':值 = '\n'elif 值 == 'Tab':值 = '\t'如果值==退格":如果 isinstance(entry, tk.Entry):entry.delete(len(entry.get())-1, 'end')#elif isinstance(entry, tk.Text):其他:# tk.Textentry.delete('end - 2c', 'end')('Caps Lock', 'Shift') 中的 elif 值:uppercase = not uppercase # 将 True 改为 False,或 False 为 True别的:如果大写:值 = value.upper()entry.insert('end', value)定义创建(根,条目):窗口 = tk.Toplevel(root)window.configure(background="cornflowerblue")window.wm_attributes("-alpha", 0.7)对于 y, enumerate(alphabets) 中的行:x = 0#for x, enumerate(row) 中的文本:对于行中的文本:如果文本在 ('Enter', 'Shift'):宽度 = 15列跨度 = 2elif 文本 == '空格':宽度 = 130列跨度 = 16别的:宽度 = 5列跨度 = 1tk.Button(window, text=text, width=width,命令=拉姆达值=文本:选择(条目,值),padx=3, pady=3, bd=12, bg="black", fg="white").grid(row=y, column=x, columnspan=columnspan)x += 列跨度#  - - 主要的  - -如果 __name__ == '__main__':根 = tk.Tk()root.title('测试键盘')label = tk.Label(root, text='测试键盘')label.grid(row=0, column=0, columnspan=2)entry1 = tk.Entry(root)entry1.grid(row=1, column=0,sticky='news')button1 = tk.Button(root, text='Keyboard', command=lambda:create(root, entry1))button1.grid(row=1, column=1,sticky='news')entry2 = tk.Entry(root)entry2.grid(row=2, column=0,sticky='news')button2 = tk.Button(root, text='Keyboard', command=lambda:create(root, entry2))button2.grid(row=2, column=1,sticky='news')text1 = tk.Text(root)text1.grid(row=3, column=0,sticky='news')button3 = tk.Button(root, text='Keyboard', command=lambda:create(root, text1))button3.grid(row=3, column=1,sticky='news')root.mainloop()

<小时>

ma​​in.py

它导入 keyboard 并使用 keyboard.create(...) 来显示键盘并将其分配给选定的 Entry文字.

<小时>

导入 tkinter 作为 tk进口键盘#  - - 主要的  - -如果 __name__ == '__main__':根 = tk.Tk()root.title('你好世界!')label = tk.Label(root, text='Form')label.grid(row=0, column=0, columnspan=3)#-----label1 = tk.Label(root, text='Entry 1')label1.grid(row=1, column=0)entry1 = tk.Entry(root)entry1.grid(row=1, column=1,sticky='news')button1 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, entry1))button1.grid(row=1, column=2,sticky='news')#-----label2 = tk.Label(root, text='Entry 2')label2.grid(row=2, column=0)entry2 = tk.Entry(root)entry2.grid(row=2, column=1,sticky='news')button2 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, entry2))button2.grid(row=2, column=2,sticky='news')#-----label3 = tk.Label(root, text='Text 1')label3.grid(row=3, column=0)text1 = tk.Text(root)text1.grid(row=3, column=1,sticky='news')button3 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, text1))button3.grid(row=3, column=2,sticky='news')root.mainloop()

<小时>

我正在考虑创建具有 Entry + Button Keyboard 的小部件,因为您经常使用这种组合.也许我稍后会创建它.

I'm having a problem with typing into my Tkinter entry. I did a registration code and with every entry on my code calls a virtual keyboard, the virtual keyboard is separated python program. I successfully called another python program but I can't type on my Tkinter entry which is my main program using the virtual keyboard I called. Is there any way to get this done? here is my code

    def register(self):
    self.master_register = Toplevel()

    self.first_name = StringVar()
    self.middle_name = StringVar()
    self.last_name = StringVar()
    self.sex = StringVar()
    self.birth_day = StringVar()
    self.civil_status = StringVar()

    self.label_head = Label(self.master_register, text = "Please fill up all informations below")
    self.label_head.pack()

    self.label_first_name = Label(self.master_register, text = "First Name")
    self.label_first_name.pack()
    self.entry_first_name = Entry(self.master_register, textvariable = self.first_name)
    self.entry_first_name.pack()
    self.entry_first_name.bind('<ButtonPress-1>',self.keyboard)

    self.label_middle_name = Label(self.master_register, text = "Middle Name")
    self.label_middle_name.pack()
    self.entry_middle_name = Entry(self.master_register, textvariable = self.middle_name)
    self.entry_middle_name.pack()
    self.entry_middle_name.bind('<ButtonPress-1>',self.keyboard)

    self.label_last_name = Label(self.master_register, text = "Last Name")
    self.label_last_name.pack()
    self.entry_last_name = Entry(self.master_register, textvariable = self.last_name)
    self.entry_last_name.pack()
    self.entry_last_name.bind('<ButtonPress-1>',self.keyboard)

    self.label_sex = Label(self.master_register, text = "Sex")
    self.label_sex.pack()
    self.radio_button_sex1 = Radiobutton(self.master_register, text = "Male", variable = self.sex, value = "Male" )
    self.radio_button_sex1.pack()
    self.radio_button_sex2 = Radiobutton(self.master_register, text = "Female", variable = self.sex, value = "Female")
    self.radio_button_sex2.pack()


    self.label_birthday = Label(self.master_register, text = "Birth Day")
    self.label_birthday.pack()
    self.entry_birthday = Entry(self.master_register, textvariable = self.birth_day)
    self.entry_birthday.pack()
    self.entry_birthday.bind('<ButtonPress-1>',self.keyboard)

    self.label_civil_status = Label(self.master_register, text = "Civil Status")
    self.label_civil_status.pack()
    self.entry_civil_status = Entry(self.master_register, textvariable = self.civil_status)
    self.entry_civil_status.pack()
    self.entry_civil_status.bind('<ButtonPress-1>',self.keyboard)

    self.button_submit = Button(self.master_register, text = "Submit", command = lambda: self.registered(self.first_name, self.middle_name,
                                                                                        self.last_name, self.sex, self.birth_day,
                                                                                        self.civil_status))
    self.button_submit.pack()

def keyboard(self, event):
    exec(open("keyboardclass.py").read());

here is my keyboardclass.py

def select(value):
if value == "Space":
    entry1.insert(tkinter.END, ' ')
elif value == "Backspace":
    entry1.delete(len(entry1.get())-1,tkinter.END)
else:
    entry1.insert(tkinter.END, value)

root = Tk()
root.configure(background = "cornflowerblue")
root.wm_attributes("-alpha", 0.7)

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']
Row = 2
Column = 0

for alphabet in alphabets:
command = lambda x=alphabet: select(x)
if alphabet != 'Space':
    Button(root, text = alphabet,
           command = command,width = 5, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column)
if alphabet == 'Enter':
    Button(root, text = alphabet,
           command = command, width = 15, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column, columnspan = 2)
if alphabet == 'Shift':
    Button(root, text = alphabet,
           command = command, width = 15, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = Row, column = Column, columnspan = 2)    
if alphabet == 'Space':
    Button(root, text = alphabet,
           command = command, width = 130, padx=3, pady=3,bd=12,bg = "black", fg="white").grid(row = 6, columnspan = 16)

Column +=1
if Column > 13 and Row == 1:
    Column = 0
    Row += 1
if Column > 13 and Row == 2:
    Column = 0
    Row +=1
if Column > 13 and Row == 3:
    Column = 0
    Row +=1
if Column > 12 and Row == 4:
    Column = 0
    Row +=1

root.mainloop()

解决方案

keyboard.py

I put code in function create() which gets root and entry as arguments - so now I can use import keyboard it other file and run keyboard.create(root, some_entry).

It uses root to create window Toplevel() instead of Tk() - and without second mainloop().

It uses entry to use it in select(entry, value) which will use entry.insert(...)

There is code in if __name__ == "__main__": so you can run it as standalone program to test keyboard.

It displays two Entry and one Text (in which you can test key Enter).

I added code for Enter, Tab, Backspace for Text (which needs different method). When you press Shift or Caps Lock then it starts to insert uppercase chars - but it doesn't change text on buttons in window.

In alphabets I grouped rows in lists so I don't need if/else to check if char should be in next row - I can use two for-loops.


import tkinter as tk

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']
]    

uppercase = False  # use uppercase chars. 

def select(entry, value):
    global uppercase

    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)

def create(root, entry):

    window = tk.Toplevel(root)
    window.configure(background="cornflowerblue")
    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 = 15
                columnspan = 2
            elif text == 'Space':
                width = 130
                columnspan = 16
            else:                
                width = 5
                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"
                     ).grid(row=y, column=x, columnspan=columnspan)

            x += columnspan

# --- main ---

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

    button1 = tk.Button(root, text='Keyboard', command=lambda:create(root, entry1))
    button1.grid(row=1, column=1, sticky='news')

    entry2 = tk.Entry(root)
    entry2.grid(row=2, column=0, sticky='news')

    button2 = tk.Button(root, text='Keyboard', command=lambda:create(root, entry2))
    button2.grid(row=2, column=1, sticky='news')

    text1 = tk.Text(root)
    text1.grid(row=3, column=0, sticky='news')

    button3 = tk.Button(root, text='Keyboard', command=lambda:create(root, text1))
    button3.grid(row=3, column=1, sticky='news')

    root.mainloop()


main.py

It imports keyboard and uses keyboard.create(...) to show keyboard and assing it to selected Entry or Text.


import tkinter as tk
import keyboard

# --- main ---

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Hello World!')

    label = tk.Label(root, text='Form')
    label.grid(row=0, column=0, columnspan=3)

    #-----    

    label1 = tk.Label(root, text='Entry 1')
    label1.grid(row=1, column=0)

    entry1 = tk.Entry(root)
    entry1.grid(row=1, column=1, sticky='news')

    button1 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, entry1))
    button1.grid(row=1, column=2, sticky='news')

    #-----    

    label2 = tk.Label(root, text='Entry 2')
    label2.grid(row=2, column=0)

    entry2 = tk.Entry(root)
    entry2.grid(row=2, column=1, sticky='news')

    button2 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, entry2))
    button2.grid(row=2, column=2, sticky='news')

    #-----    

    label3 = tk.Label(root, text='Text 1')
    label3.grid(row=3, column=0)

    text1 = tk.Text(root)
    text1.grid(row=3, column=1, sticky='news')

    button3 = tk.Button(root, text='Keyboard', command=lambda:keyboard.create(root, text1))
    button3.grid(row=3, column=2, sticky='news')

    root.mainloop()


I was thinking to create widget which has Entry + Button Keyboard because you use this combination very often. Maybe I create it later.

这篇关于在另一个 python 程序中使用虚拟键盘输入条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆