entry_focus после сообщения, как это сделать - PullRequest
0 голосов
/ 10 февраля 2020

Как я могу это исправить? Я не могу понять, как сфокусироваться после окна сообщения.
Мой код:

##########
    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()

1 Ответ

0 голосов
/ 11 февраля 2020

Я проверил ваш код, и он отлично работает для меня. Но есть два других способа, у которых есть небольшое преимущество перед тем, как вы пытаетесь.

1. По глобализации:

Вы можете глобализировать свою переменную (vn) и виджет ввода (vn_entry) внутри функции (call), поэтому есть больше шансов, что ваша функция легко поймет, какая переменная и виджет 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()

Примечание:

  • Вы import ing * от tkinter, тогда как * import s не рекомендуется. Вы должны import tkinter as tk или as все, что вы хотите.
  • Вы не передаете окно (Tk()) некоторым из ваших виджетов, что не является хорошей практикой.
  • Создание эти улучшения вашего уже существующего кода также могут вам помочь.
...