#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()
, это приведет к удалению записи каждую секунду.
Это работает, когда вы также хотите выполнить поиск в других городах.