В программе намеренно не использовалась библиотека 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"] }