экранная клавиатура, связь между Toplevel и Tk на питонах tkinter - PullRequest
1 голос
/ 31 марта 2020

Я пытался создать свою собственную маленькую экранную клавиатуру, но не смог, когда я попытался заставить кнопки вставить текст в виджет ввода ...

я представляю, что может быть решение, подобное «я». 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()

большое спасибо за вашу помощь !!!

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете использовать эмулированные события, например:

entry.focus_force()
entry.event_generate("<Key-A>")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...