【问题标题】:entry_focus after messagebox how to do it消息框后的entry_focus怎么做
【发布时间】:2020-02-10 15:52:37
【问题描述】:

我该如何解决这个问题?在消息框之后我不知道如何聚焦。
我的代码:

##########
    from tkinter import*
    from tkinter import messagebox
    def call():
        vn_info = vn.get()
        if vn_info=="":
             messagebox.showinfo("ok","test1")
             vn_entry.focus_set()

    window=Tk()
    window.geometry("500x500")

    window.title("testfocus")
    heading= Label(text= "focus", bg="grey", fg="black",width="500",height="3")
    heading.pack()

    vn_text=Label(text="Vn")

    vn_text.place(x=15,y=70)

##########

    vn=StringVar()
    vn_entry=Entry(textvariable=vn,width="30")
    vn_entry.place(x=15,y=90)
    bt=Button(window,text="call",width=30,height="2",command=call,bg="green")
    bt.place(x=15,y=280)
    window.mainloop()

【问题讨论】:

  • 你想focus你的Entry小部件吗?
  • 是的,这就是我想要的。
  • 输入栏有焦点在我这边。 Windows 10。您使用的是不同的操作系统吗?
  • 我用的是windows10和pycharm。
  • 好吧,你的代码按预期工作。弹出消息后,输入字段的焦点可以正常工作。

标签: python-3.x tkinter tkinter-entry


【解决方案1】:

我已经测试了您的代码,它对我来说运行良好。但是还有另外两种方法比您尝试的方法稍有优势。

1.按全球化:

您可以在函数(call) 中将变量(vn) 和Entry Widget(vn_entry) 全球化,这样您的函数就有更多机会轻松理解要处理的变量和Entry 小部件。

像这样:

import tkinter as tk
from tkinter import messagebox


def call():
    global vn, vn_entry

    vn_info = vn.get()
    if vn_info == "":
        messagebox.showinfo("ok", "test1")
        vn_entry.focus_set()


window = tk.Tk()
window.geometry("500x500")
window.title("testfocus")

heading = tk.Label(window, text="focus", bg="grey", fg="black", width="500", height="3")
heading.pack()

vn_text = tk.Label(window, text="Vn")
vn_text.place(x=15, y=70)

vn = tk.StringVar()

vn_entry = tk.Entry(window, textvariable=vn, width="30")
vn_entry.place(x=15, y=90)

bt = tk.Button(window, text="call", width=30, height="2", command=call, bg="green")
bt.place(x=15, y=280)

window.mainloop()

2。通过传递参数:

您可以将您的变量(vn)和 Entry Widget(vn_entry)作为参数传递给函数(call),这样您的函数也有更多机会轻松理解要处理的变量和 Entry 小部件.

像这样:

import tkinter as tk
from tkinter import messagebox


def call(var, e):

    vn_info = var.get()
    if vn_info == "":
        messagebox.showinfo("ok", "test1")
        e.focus_set()


window = tk.Tk()
window.geometry("500x500")
window.title("testfocus")

heading = tk.Label(window, text="focus", bg="grey", fg="black", width="500", height="3")
heading.pack()

vn_text = tk.Label(window, text="Vn")
vn_text.place(x=15, y=70)

vn = tk.StringVar()

vn_entry = tk.Entry(window, textvariable=vn, width="30")
vn_entry.place(x=15, y=90)

bt = tk.Button(window, text="call", width=30, height="2", command=lambda: call(vn, vn_entry), bg="green")
bt.place(x=15, y=280)

window.mainloop()

注意:

  • 你是 importing * from tkinter,而 * imports 不鼓励。你应该import tkinter as tkas 任何你想要的东西。
  • 您没有将窗口 (Tk()) 传递给您的某些小部件,这不是一个好的做法。
  • 对您自己现有的代码进行这些改进也可能对您有所帮助。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2011-05-11
    • 2021-06-26
    • 1970-01-01
    • 2021-04-02
    • 2012-04-02
    相关资源
    最近更新 更多