Я пытался создать свою собственную маленькую экранную клавиатуру, но не смог, когда я попытался заставить кнопки вставить текст в виджет ввода ...
я представляю, что может быть решение, подобное «я». text_in.insert, но я не могу вызвать эту функцию из класса клавиатуры ...
другое решение, которое я мог бы себе представить, это отправить текст нажатой кнопки на id виджета ввода, но для этого я не знаю ни одного кода ...
есть ли лучшее решение, чем один из них? как бы вы решили эту проблему? Мне действительно нужна помощь.
import tkinter as tk
from tkinter import ttk
class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
ttk.Button(self, text="show Keyboard", command=lambda: Keyboard(self)).pack()
self.text = tk.StringVar(value="")
self.text_in = ttk.Entry(self, textvariable=self.text)
self.text_in.pack()
class Keyboard(tk.Toplevel):
OPENED = False
NAME = "- Keyboard -"
NUM = ({"1":{"text":"1", "info":"6", "width":1},
"2":{"text":"2", "info":"7", "width":1},
"3":{"text":"3", "info":"8", "width":1}})
CHAR = ({"A":{"text":"A", "info":"a, A", "width":1},
"B":{"text":"B", "info":"b, B", "width":1},
"C":{"text":"C", "info":"c, C", "width":1}})
def __init__(self, master):
if not Keyboard.OPENED:
Keyboard.OPENED = True
print("keyboard opened!")
tk.Toplevel.__init__(self, master)
self.title(self.NAME)
self.protocol("WM_DELETE_WINDOW", self.close)
self.keyb_nb = ttk.Notebook(self)
self.keyb_nb.pack()
self.num_tab = ttk.Frame(self.keyb_nb)
self.createPad(self.num_tab, Keyboard.NUM, 5)
self.keyb_nb.add(self.num_tab, text="123")
self.char_tab = ttk.Frame(self.keyb_nb)
self.createPad(self.char_tab, Keyboard.CHAR, 7)
self.keyb_nb.add(self.char_tab, text="ABC")
def createPad(self, master, pad:dict, max_col):
self.co_count = 0
self.ro = 1
for button in pad.keys():
self.b = ttk.Button(master, width=6*pad[button]["width"], text=pad[button]["text"], command=self.bclicked(button))
if self.co_count >= max_col:
self.ro = self.ro + 1
self.co_count = 0
self.b.grid(row=self.ro, columnspan=pad[button]["width"], column=self.co_count)
self.co_count = self.co_count+pad[button]["width"]
def bclicked(self, button:str):
### this is the callback of the button "button", given as parameter
### here the code wich solves my problem should be entered. but if there is a other option then this function also can be deleted
pass
def close(self):
Keyboard.OPENED = False
self.destroy()
print("keyboard closed!")
root = MainWindow()
root.mainloop()
большое спасибо за вашу помощь !!!