Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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 Tkinter组合框在调用focus_force时不工作_Python_Tkinter - Fatal编程技术网

Python Tkinter组合框在调用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.

我试图在组合框中选择项目,但在调用顶级窗口上的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.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函数。乔:看起来很小的改变实际上相当重要。请参阅我答案的更新。