В программе намеренно не использовалась библиотека pillow, с которой проще было бы уменьшать изображения. Уменьшение изображений сделано исключительно средствами Tkinter. Для работы с интернет нужно установить библиотеку requests командой:
pip install requests
from tkinter import Tk, Canvas, Button, Label, END, Text, Entry, Scrollbar, NW, PhotoImage
from math import ceil
from random import choice
import json
import requests
W = 200
H = 200
def load_towns():
jtowns = {}
with open('towns.json') as f:
jtowns = json.load(f)
return jtowns
def get_towns_list_from_dict(jtowns):
litown = list(jtowns.keys())
return litown
def get_images_list_from_dict(jtowns, litown):
limages = []
for n, town in enumerate(litown):
_1, _2, url = jtowns.get(town)
response = requests.get(url)
with open(f'./img/{n}.png', 'wb') as file:
file.write(response.content)
image_town = get_town_image(f'./img/{n}.png')
limages.append(image_town)
return limages
def get_town_data_from_dict(jtowns, town):
count, about, url = jtowns.get(town)
text.delete(1.0, END)
text.insert(1.0, about)
get_inet_town_image(url)
print(town, url)
image_town = get_town_image()
can.itemconfig(image_town_place, image=image_town)
print(url)
#text.config(text=about)
def get_inet_town_image(url):
response = requests.get(url)
with open('town.png', 'wb') as file:
file.write(response.content)
def get_town_image(file_name="town.png"):
image = PhotoImage(file=file_name)
img_w = image.width()
img_h = image.height()
if (img_w > W) and (img_h > H):
kw = ceil(img_w / W)
kh = ceil(img_h / H)
k = max(kw, kh)
image_out = image.subsample(k, k)
else:
kw = ceil(W / img_w)
kh = ceil(H / img_h)
k = min(kw, kh)
image_out = image.zoom(k, k)
#print(image_out.width(), image_out.height(), k)
return image_out
def run_choice():
global town
town = choice(towns)
get_town_data_from_dict(towns_data, town)
can.itemconfig(image_town_place, image=towns_images[towns.index(town)])
def put_answer():
global image_town_place
image_town2 = PhotoImage(file="town.png")
can.itemconfig(image_town_place, image=image_town2)
town = ''
win = Tk()
can = Canvas(win, width=W, height=H, bg="lightcyan")
url = "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"
get_inet_town_image(url)
image_town = get_town_image()
image_town_place = can.create_image(10, 10, image=image_town, anchor=NW)
btn_run = Button(win, text="Загадать город", command=run_choice)
btn_ans = Button(win, text="Ответить", command=put_answer)
answer = Entry(win, width=30)
text = Text(win, width=60, height=20)
scroll = Scrollbar(command=text.yview)
text.config(yscrollcommand=scroll.set)
can.grid(column=0, row=0)
btn_run.grid(column=0, row=1)
btn_ans.grid(column=0, row=2)
answer.grid(column=0, row=3)
text.grid(column=1, row=0, rowspan=4)
scroll.grid(column=2, row=0, rowspan=4)
#pack(anchor=NW, padx=6, pady=6)
towns_data = load_towns()
towns = get_towns_list_from_dict(towns_data)
towns_images = get_images_list_from_dict(towns_data, towns)
print(choice(towns))
win.mainloop()
Файл towns.json с описаниями городов
{
"Москва": [13010112, "Один из субъектов Федерации, находится в центре европейской части России. Наиболее населённый город России и Европы, один из крупнейших городов мира. Входит в число городов Золотого кольца России. Город стоит на семи холмах, имеет радиальную структуру застройки и дорог. Город часто называют «Третьим Римом», следующим за Римом и Константинополем соответственно.", "https://www.ttk-com.ru/wp-content/uploads/2021/04/b2b-korporativnaya-set-vpn.png"],
"Санкт-Петербург": [5601911, "Про СПБ", "https://kuda-spb.ru/uploads/7de4519568b61a222f5391f0dbdc796d.png"],
"Новосибирск": [1633595, "Про Новосибирск", "https://m.elektro.ru/upload/medialibrary/272/2720cbd72a5297eb9a92fe1fa1cf3ae7.png"],
"Екатеринбург": [1588665, "Про Екатеринбург", "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"],
"Казань": [1308660, "Про Москву", "https://a.travelcdn.mts.ru/travel-media/medium_kazan_Main_0dca547025.png"],
"Нижний Новгород": [1249861, "Про Нижний Новгород", "https://govoritnn.ru/wp-content/uploads/2023/09/vid-na-nagornuju-chast.png"],
"Челябинск": [1189525, "Про Челябинск", "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"],
"Красноярск": [1188533, "Про Красноярск", "https://a.travelcdn.mts.ru/travel-media/medium_1_10_01e217a412.png"],
"Самара": [1173393, "Про Самару", "https://www.funnyart.club/uploads/posts/2022-01/thumbs/1641471587_20-www-funnyart-club-p-foni-s-gorodom-samara-24.png"],
"Уфа": [1144809, "Про Уфу", "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"],
"Ростов-на-Дону": [1142162, "Про Ростов-на-Дону", "https://zaryasa.ru/wp-content/uploads/2022/09/60e3091a13a66.png"],
"Омск": [1125695, "Про Омск", "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"],
"Краснодар": [1204878, "Про Краснодар", "https://maestroceramica.ru/components/com_virtuemart/assets/images/vmgeneral/warning.png"],
"Воронеж": [1057681, "Про Воронеж", "https://a.travelcdn.mts.ru/travel-media/medium_voron_1_cb53d62dd3.png"],
"Волгоград": [1028036, "Про ВЛГРД", "https://welcometimes.ru/sites/default/files/styles/desktop_1366custom_user_1366_plus_1x/public/field/image/v_volgogradskoy-min.png?itok=AQXKsNsU×tamp=1695303365"],
"Пермь": [1034006, "Про Пермь", "https://s0.rbk.ru/v6_top_pics/resized/590xH/media/img/1/47/755833179434471.png"]
}
