如何从顶层窗口到主窗口获取变量?

时间:2019-05-04 17:24:51

标签: python tkinter

我有一个获取键输入并将其显示在主窗口顶层窗口中的输入框上的代码。在主窗口中,我有一个列表框,我希望在按下顶层的确认按钮时,获取输入框上显示的键输入。

我尝试了几种方法将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 个答案:

答案 0 :(得分:1)

要从一个类到另一个类获取值,必须将它们链接起来。直接将Widget继承给该类将极大地帮助您在session.save(ac); // you should to add this bottom line session.getTransaction().commit(); 窗口和Tk()窗口之间建立连接。

Toplevel()窗口已经打开时,还有一件事情需要通过配置Keyboard来禁用按钮,这样用户就不会错误地打开另一个窗口,并且当state = 'disabled'窗口关闭时,通过Keyboard启用按钮。

这是完整的代码:

state = 'normal'