Python Tkinter组合框在调用focus_force时不工作
我试图在组合框中选择项目,但在调用顶级窗口上的focus_force后,该项目不起作用窗口中的其他小部件起作用,但组合框选择不起作用 当我从代码中删除focus_force时,它可以正常工作,但希望保留它作为主代码Python Tkinter组合框在调用focus_force时不工作,python,tkinter,Python,Tkinter,我试图在组合框中选择项目,但在调用顶级窗口上的focus_force后,该项目不起作用窗口中的其他小部件起作用,但组合框选择不起作用 当我从代码中删除focus_force时,它可以正常工作,但希望保留它作为主代码 #!python3 import tkinter as tk import tkinter.ttk as ttk def toplevel_window(): global top, cb top = tk.Toplevel(root) top.
#!python3
import tkinter as tk
import tkinter.ttk as ttk
def toplevel_window():
global top, cb
top = tk.Toplevel(root)
top.title("TOP")
top.geometry("300x300")
cb = ttk.Combobox(top, values=["djdjd", "fjfjf"])
cb.pack()
BT = tk.Button(top, text="print", command=combo_select)
BT.pack(side=tk.BOTTOM)
top.bind("<FocusOut>", focusout_func)
top.bind("<<ComboboxSelected>>", combo_select)
def focusout_func(event):
print(cb.get())
top.focus_force()
top.bell()
def combo_select(event=None):
print(cb.get())
root = tk.Tk()
root.geometry("600x600")
root.title("root")
b = tk.Button(text="OPEN TOPLEVEL", command=toplevel_window)
b.pack()
root.mainloop()
组合框选择不起作用的原因是,当尝试在包含该函数的窗口中选择该函数时,会调用该函数focusout_func,从而将焦点移回顶级窗口本身,从而阻止选择的发生
一种解决方案是根本不使用回调函数。相反,首先在toplevel_窗口函数的末尾添加top.focus_force调用,以便在创建后立即将焦点切换到它
其次,要使用Combobox将焦点保持在窗口上,并在尝试将焦点从它切换到其他窗口时发出铃声警报,您可以将回调绑定到根窗口,并检查其中另一个窗口的状态,如果它存在并且正在显示,则防止更改焦点
以下是我的建议:
import tkinter as tk
import tkinter.ttk as ttk
from _tkinter import TclError
def toplevel_window():
global top, cb
top = tk.Toplevel(root)
top.title("TOP")
top.geometry("300x300")
cb = ttk.Combobox(top, values=["djdjd", "fjfjf"])
cb.pack()
btn = tk.Button(top, text="print", command=combo_select)
btn.pack(side=tk.BOTTOM)
top.bind("<<ComboboxSelected>>", combo_select)
top.focus_force()
def combo_select(event=None):
print('cb.get():', cb.get())
def root_focusin_callback(event):
try:
top_state = top.state() # Check status of toplevel widget.
except (NameError, TclError) as exc:
pass # Ignore - widget doesn't exist or was closed.
else:
top.bell()
top.focus_force()
root = tk.Tk()
root.geometry("600x600")
root.title("root")
root.bind("<FocusIn>", root_focusin_callback)
b = tk.Button(text="OPEN TOPLEVEL", command=toplevel_window)
b.pack()
root.mainloop()
我想调用focusout_func,在打开顶层时单击根窗口时敲钟。我忘了给它添加bell函数。乔:看起来很小的改变实际上相当重要。请参阅我答案的更新。