Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从顶层窗口到主窗口获取变量?_Python_Tkinter - Fatal编程技术网

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

Python 如何从顶层窗口到主窗口获取变量?,python,tkinter,Python,Tkinter,我有一个代码,可以获取keyinputs并将其显示在主窗口顶层窗口的entrybox上。在主窗口中,我有一个列表框,我希望当按下顶层的确认按钮时,可以获得显示在输入框上的按键输入 我尝试了几种方法将evt.keysym添加到我的列表框中,但都失败了 class EntryBox(tk.Entry): def __init__(self, master, cnf = {}, **kw): kw = tk._cnfmerge((kw, cnf)) kw['ju

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

我尝试了几种方法将
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()
类入口框(tk.Entry):
def_uuuinit_uuuu(self,master,cnf={},**kw):
千瓦=tk._cnfmerge((千瓦,立方英尺))
kw['justify']=kw.get('justify','center')
千瓦【宽度】=15
kw[“状态”]=“只读”
超级(入口盒,自身)。\uuuuu初始(主控=主控,**kw)
self.unbind_类('Entry','')
self.unbind_类('Entry','')
self.bind_类(self,,,self._显示)
def_显示器(自身、evt):
自我['state']='normal'
self.delete('0','end')
self.insert('0',str(evt.keysym))
self['state']='readonly'
类键盘:
定义初始化(自):
self.kb=tk.Toplevel()
kb_frame=ttk.frame(self.kb)
kb_frame.grid(列=0,行=1,pady=(7,19))
ttk.Label(kb_frame,text='Enter Key').grid(列=0,行=0,pady=4)
条目=入口框(kb\U帧)
entry.grid(列=0,行=1)
#确认按钮
self.co_button=ttk.button(self.kb,text='Confirm')
self.co_按钮.grid(列=0,行=2)
班长:
定义初始化(自):
self.win=tk.tk()
#列表框
lb_frame=tk.frame(self.win)
lb_框架网格(列=0,行=0)
scrollbar=tk.scrollbar(lb_框架,orient='vertical')
grid(列=1,行=0,sticky='NS',pady=(12,4))
listbox=tk.listbox(lb_帧,选择mode='extended',width=25,
高度=16,
yscrollcommand=scrollbar.set,activestyle='none')
grid(列=0,行=0,sticky='NSEW',padx=(6,0),pady=(12,4))
scrollbar.config(命令=listbox.yview)
#打开toplevel的按钮
bt_frame=ttk.frame(self.win)
bt_frame.grid(列=2,行=0,行跨度=2)
self.kb_button=ttk.button(bt_框架,text='KeyBoard',command=KeyBoard)
self.kb_button.grid(列=0,行=0)
main=main()
main.win.mainloop()

要从一个类到另一个类获取值,必须将它们链接起来。将这些小部件直接继承到类中将有助于在
Tk()
窗口和
Toplevel()
窗口之间建立连接

还有一件事,当
键盘
窗口已经打开时,通过配置
状态='disabled'
禁用按钮,这样用户就不会错误地打开另一个按钮;当
键盘
窗口关闭时,通过
状态='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()
将tkinter作为tk导入
将tkinter.ttk导入为ttk
类入口框(tk.Entry):
def_uuuinit_uuuu(self,master,cnf={},**kw):
千瓦=tk._cnfmerge((千瓦,立方英尺))
kw['justify']=kw.get('justify','center')
千瓦【宽度】=15
kw[“状态”]=“只读”
超级(入口盒,自身)。\uuuuu初始(主控=主控,**kw)
self.bind_类(self,,,self._显示)
def_显示器(自身、evt):
自我['state']='normal'
self.delete('0','end')
self.insert('0',str(evt.keysym))
self['state']='readonly'
类键盘(tk.Toplevel):
def uuu init uuuu(self,master=None,cnf={},**kw):
超级(键盘,自我)。\uuuuu初始(主控=主控,cnf=cnf,**千瓦)
self.master=master
kb_frame=ttk.frame(自)
kb_frame.grid(列=0,行=1,pady=(7,19))
ttk.Label(kb_frame,text='Enter Key').grid(列=0,行=0,pady=4)
self.entry=EntryBox(kb\U帧)
self.entry.grid(列=0,行=1)
#此协议在单击标题栏上的“x”时调用该函数
self.protocol(“WM_DELETE_WINDOW”,self.Destroy)
#确认按钮
self.co_按钮=ttk.按钮(self,text='Confirm',command=self.on_按)
self.co_按钮.grid(列=0,行=2)
def on_按下(自):
key=self.entry.get()
#条件不具有重复值,如果要具有重复值,请删除该条件
如果键不在self.master.lb.get('0','end')和键中:
#将键插入主窗口的列表框
self.master.lb.insert('结束',键)
def销毁(自我):
#启用按钮
self.master.kb_按钮['state']='normal'
#然后摧毁窗户
自我毁灭
主类(tk.tk):
定义初始化(自):
超级(主,自).\uuuu初始化
bt_帧=ttk帧(自)
bt_frame.grid(列=2,行=0,行跨度=2)
self.kb_button=ttk.button(bt_框,text='KeyBoard',command=self.on_按)
self.kb_button.grid(列=0,行=0)
self.lb=tk.Listbox(bt_帧)
self.lb.grid(列=0,行=1)
def on_按下(自):
#创建顶级窗口并将self作为主参数传递
self.Kb=键盘(self)
#禁用该按钮
self.kb_按钮['state']='disabled'
main=main()
main.mainloop()

code from
Keyboard
put in
Main
,您将可以访问
TopLevel
。然后您可以删除类
Keyboard
或分配给在
Main
中创建的按钮函数,该函数应创建
Keyboard
,这样
Main
将有权访问
Keyboard
Keyboard.kb
当条目为空时,如何使其不登记?有了这个,我可以在列表框中输入黑线,当我点击确认时,条目是空的,我不想这样。我只是通过检查
条目
是否是空的来修复它。我试图制定self.protocol,但不知道如何做。非常感谢。