Как получить переменные из верхнего уровня окна в главное окно? - PullRequest
1 голос
/ 04 мая 2019

У меня есть код, который получает ключевые входы и показывает его в поле ввода в окне верхнего уровня главного окна.В главном окне у меня есть окно со списком, и я хочу получить ввод ключа, который отображается в поле ввода для зачисления при нажатии кнопки подтверждения на верхнем уровне.

Я пробовал несколько способов получить evt.keysym длямой список, но все не удалось.

class EntryBox(tk.Entry):
    def __init__(self, master, cnf = {}, **kw):
        kw = tk._cnfmerge((kw, cnf))
        kw['justify'] = kw.get('justify', 'center')
        kw['width'] = 15
        kw['state'] = 'readonly'
        super(EntryBox, self).__init__(master=master, **kw)
        self.unbind_class('Entry', '<BackSpace>')
        self.unbind_class('Entry', '<Key>')
        self.bind_class(self, '<Key>', self._display)

    def _display(self, evt):
        self['state'] = 'normal'
        self.delete('0', 'end')
        self.insert('0', str(evt.keysym))
        self['state'] = 'readonly'

class Keyboard:
    def __init__(self):
        self.kb = tk.Toplevel()

        kb_frame = ttk.Frame(self.kb)
        kb_frame.grid(column=0, row=1, pady=(7, 19))
        ttk.Label(kb_frame, text='Enter Key').grid(column=0, row=0, pady=4)
        entry = EntryBox(kb_frame)
        entry.grid(column=0, row=1)

        # Confirm button
        self.co_button = ttk.Button(self.kb, text='Confirm')
        self.co_button.grid(column=0, row=2)

class Main:
    def __init__(self):
        self.win = tk.Tk()
        # listbox
        lb_frame = tk.Frame(self.win)
        lb_frame.grid(column=0, row=0)
        scrollbar = tk.Scrollbar(lb_frame, orient='vertical')
        scrollbar.grid(column=1, row=0, sticky='NS', pady=(12, 4))
        listbox = tk.Listbox(lb_frame, selectmode='extended', width=25, 
                             height=16,
                             yscrollcommand=scrollbar.set, activestyle='none')
        listbox.grid(column=0, row=0, sticky='NSEW', padx=(6, 0), pady=(12, 4))
        scrollbar.config(command=listbox.yview)

        # button to open toplevel
        bt_frame = ttk.Frame(self.win)
        bt_frame.grid(column=2, row=0, rowspan=2)

        self.kb_button = ttk.Button(bt_frame, text='KeyBoard', command=KeyBoard)
        self.kb_button.grid(column=0, row=0)

main = Main()
main.win.mainloop()

1 Ответ

1 голос
/ 04 мая 2019

Чтобы получить значения из одного класса в другой класс, вы должны связать их.Наследование виджетов непосредственно в классе очень поможет вам в установлении соединения между окном Tk() и окном Toplevel().

Еще одна вещь, когда окно Keyboard уже открыто, отключите кнопку при конфигурированииstate = 'disabled', поэтому пользователь не откроет еще один по ошибке, и когда окно Keyboard закроется, снова включите кнопку state = 'normal'.

Вот полный код:

import tkinter as tk
import tkinter.ttk as ttk

class EntryBox(tk.Entry):
    def __init__(self, master, cnf = {}, **kw):
        kw = tk._cnfmerge((kw, cnf))
        kw['justify'] = kw.get('justify', 'center')
        kw['width'] = 15
        kw['state'] = 'readonly'
        super(EntryBox, self).__init__(master=master, **kw)
        self.bind_class(self, '<Key>', self._display)

    def _display(self, evt):
        self['state'] = 'normal'
        self.delete('0', 'end')
        self.insert('0', str(evt.keysym))
        self['state'] = 'readonly'


class Keyboard(tk.Toplevel):
    def __init__(self, master=None, cnf={}, **kw):
        super(Keyboard, self).__init__(master=master, cnf=cnf, **kw)
        self.master = master
        kb_frame = ttk.Frame(self)
        kb_frame.grid(column=0, row=1, pady=(7, 19))
        ttk.Label(kb_frame, text='Enter Key').grid(column=0, row=0, pady=4)
        self.entry = EntryBox(kb_frame)
        self.entry.grid(column=0, row=1)

        # This protocol calls the function when clicked on 'x' on titlebar
        self.protocol("WM_DELETE_WINDOW", self.Destroy)

        # Confirm button
        self.co_button = ttk.Button(self, text='Confirm', command=self.on_press)
        self.co_button.grid(column=0, row=2)

    def on_press(self):
        key = self.entry.get()
        # Condition to not have duplicate values, If you want to have duplicate values remove the condition
        if key not in self.master.lb.get('0', 'end') and key:
            # Insert the Key to the listbox of mainwindow
            self.master.lb.insert('end', key)

    def Destroy(self):
        # Enable the button
        self.master.kb_button['state'] = 'normal'
        # Then destroy the window
        self.destroy()

class Main(tk.Tk):
    def __init__(self):
        super(Main, self).__init__()

        bt_frame = ttk.Frame(self)
        bt_frame.grid(column=2, row=0, rowspan=2)

        self.kb_button = ttk.Button(bt_frame, text='KeyBoard', command=self.on_press)
        self.kb_button.grid(column=0, row=0)

        self.lb = tk.Listbox(bt_frame)
        self.lb.grid(column=0, row=1)

    def on_press(self):
        # Creating a toplevel window and passed self as master parameter
        self.Kb = Keyboard(self)
        # Disabled the button
        self.kb_button['state'] = 'disabled'


main = Main()
main.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...