Python Tkinter удаляет запись в функции

#python #user-interface #tkinter

#python #пользовательский интерфейс #tkinter

Вопрос:

Я пытаюсь создать приложение для отображения времени в разных часовых поясах. Я пытался сделать ошибки messagebox, если записи нет в pytz.all_timezones, а также если пользователь ввел что-то, что не содержит запятой. Приложение, похоже, работает до тех пор, пока я не начну удалять запись, и оно выдает окно сообщения, которое мне не нужно. Кроме того, как я могу позволить изменению записи не влиять на время, пока я снова не нажму кнопку поиска, потому что, как только я начинаю удалять запись, время перестает обновляться.

Спасибо

 import tkinter as tk
from tkinter import *
from tkinter import messagebox
from datetime import datetime
import pytz
import time

root=tk.Tk()
root.title('Time app')


def times():
    a = entry_1.get()

    try:

        b = a.index(',')
        c = a[b   2:]   '/'   a[:b]

        if c in pytz.all_timezones:
            home = pytz.timezone(c)
            local_time = datetime.now(home)
            current_time = local_time.strftime('%H:%M:%S')

            place_lbl = Label(root, text=a, bg='grey', width=15, font=('bold', 25))
            place_lbl.place(relx=0.33, rely=0.4)
            time_lbl = Label(root, text=current_time, bg='grey', font=('bold', 30))
            time_lbl.place(relx=0.41, rely=0.5)
            time_lbl.after(200,times)
           

        else:
            messagebox.showerror('Error',"Cannot find '{}'. Please enter in form city, continent (e.g. London, Europe).".format(a))


    except:
        messagebox.showerror('Error',"Cannot find '{}'. Please enter in form city, continent (e.g. London, Europe).".format(a))

    entry_1.delete(first=0, last=20)


canvas=tk.Canvas(root,height=400,width=700,bg='grey')
canvas.grid()

header_lbl=Label(root,text='Enter a city: ',bg='grey',fg='black',font=('bold',25))
header_lbl.place(relx=0.41,rely=0.1)

entry_1=Entry(root)
entry_1.place(relx=0.37,rely=0.2)

search_btn=Button(root,text='Search',command=times)
search_btn.place(relx=0.47,rely=0.3)

root.mainloop()
  

Комментарии:

1. Причина except , по которой выполняется блок, заключается в том, что b = a.index(',') возвращает ValueError

2. Я добавил ответ, дайте мне знать

3. Это блестяще, большое спасибо за отличное объяснение, теперь оно работает отлично.

Ответ №1:

Вот как я исправил эту проблему, может быть и другой способ.

 def value():
    global a
    a = entry_1.get()

def times():
    try:
        b = a.index(',')
        c = a[b   2:]   '/'   a[:b]
        if c in pytz.all_timezones:
            home = pytz.timezone(c)
            local_time = datetime.now(home)
            current_time = local_time.strftime('%H:%M:%S')

            place_lbl = Label(root, text=a, bg='grey', width=15, font=('bold', 25))
            place_lbl.place(relx=0.33, rely=0.4)
            time_lbl = Label(root, text=current_time, bg='grey', font=('bold', 30))
            time_lbl.place(relx=0.41, rely=0.5)
            time_lbl.after(1000,times)
        else:
            messagebox.showerror('Error',"Cannot find '{}'. Please enter in form city, continent (e.g. London, Europe).".format(a))
    except:
        messagebox.showerror('Error',"Cannot find '{}'. Please enter in form city, continent (e.g. London, Europe).".format(a))
  

Обязательно измените свою кнопку на:

 search_btn = Button(root,text='Search',command=lambda:[value(),times(),entry_1.delete(0, END)])
  

Проблема в том, что вы используете after() , но после запуска кода поле ввода пусто, а затем вы будете использовать удаленное значение внутри поля. Поэтому я первоначально передал значение другой функции, чтобы оно было сохранено там.

С помощью команды кнопки я вызываю три функции, первая из value() которых будет иметь значение из виджета ввода, затем times() и следующая — удаление виджета ввода. Если вы включите удаление внутри times() , это приведет к удалению записи каждую секунду.

Это работает, когда вы также хотите выполнить поиск в других городах.