Python 如何从顶层窗口到主窗口获取变量?
我有一个代码,可以获取keyinputs并将其显示在主窗口顶层窗口的entrybox上。在主窗口中,我有一个列表框,我希望当按下顶层的确认按钮时,可以获得显示在输入框上的按键输入 我尝试了几种方法将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
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 fromKeyboard
put inMain
,您将可以访问TopLevel
。然后您可以删除类Keyboard
或分配给在Main
中创建的按钮函数,该函数应创建Keyboard
,这样Main
将有权访问Keyboard
和Keyboard.kb
当条目为空时,如何使其不登记?有了这个,我可以在列表框中输入黑线,当我点击确认时,条目是空的,我不想这样。我只是通过检查条目
是否是空的来修复它。我试图制定self.protocol,但不知道如何做。非常感谢。