Рейтинг  

Яндекс.Метрика
Яндекс цитирования
 

   

Статистика  

Пользователи
7
Материалы
578
Кол-во просмотров материалов
2742677
   

В программе намеренно не использовалась библиотека 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"]
}
Вложения:
Скачать этот файл (towns.json)towns.json[ ]2 Кб
Скачать этот файл (towns.py)towns.py[ ]3 Кб
   
   

Login Form