Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2021, 13:53   #1
ПРО77
Пользователь
 
Регистрация: 19.04.2020
Сообщений: 13
По умолчанию Python, tkinter, путаюсь в тегах

Это заготовка школьного тренажёра по странам и столицам.
Заполнение вручную. Справа столицы, слева страны. Щелчком мыши выносим страну и столицу в середину. До этого момента готово.
Предполагается, что при совпадении страны и столицы они должны исчезнуть. Совпадение хочу отследить равенством тегов, но не могу их вытащить и сравнить..
Подскажите, пожалуйста, как это сделать? Нужно максимально просто, без массивов, списков и т.д.
Спасибо!!
(количество совпадений тоже посчитаю, будет цикл. Но потом.)

Код:
from tkinter import *
root = Tk()

canv = Canvas(root, width=1040, height=700, bg='white')
canv.pack()
def click(event):                       
    item = canv.find_closest(event.x, event.y)[0]
    if event.x < 520:
        canv.coords(item, 300, 200)
    else:
        canv.coords(item, 300, 250)          
        
canv.create_text(61,101,text="Норвегия",anchor="nw", tag="Норвегия" )
canv.create_text(61,146,text="Финляндия",anchor="nw", tag="Финляндия")
canv.create_text(525,101,text="Осло",anchor="nw",tag="Норвегия" )
canv.create_text(525,146,text="Хельсинки",anchor="nw", tag="Финляндия")

canv.bind('<1>',click)
   
root.mainloop()
ПРО77 вне форума Ответить с цитированием
Старый 09.10.2021, 22:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
from tkinter import *
root = Tk()

canv = Canvas(root, width = 1040, height = 700, bg = 'white')
canv.pack()

first_item = None

def click(event): 
    global first_item

    item = canv.find_closest(event.x, event.y)[0]

    if first_item is None:
        first_item = (item, *canv.coords(item))
        if event.x < 520:
            canv.coords(item, 300, 200)
        else:
            canv.coords(item, 300, 250)
    else:
        if canv.gettags(first_item[0])[0] == canv.gettags(item)[0]:
            canv.delete(item)
            canv.delete(first_item[0])
        else:
            canv.coords(*first_item)

        first_item = None

canv.create_text(61, 101, text = "Норвегия", anchor = "nw", tag = "Норвегия")
canv.create_text(61, 146, text = "Финляндия", anchor = "nw", tag = "Финляндия")
canv.create_text(525, 101, text = "Осло", anchor = "nw", tag = "Норвегия")
canv.create_text(525, 146, text = "Хельсинки", anchor = "nw", tag = "Финляндия")

canv.bind('<1>', click)
   
root.mainloop()
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.10.2021, 14:17   #3
ПРО77
Пользователь
 
Регистрация: 19.04.2020
Сообщений: 13
По умолчанию

Огромное спасибо за поддержку, дорогой BDA!
Тут такая вещь в коде: страна в середину выносится, а столица - нет. (но они исчезают - это здорово!!)
(я сначала подумала, что перенос в середину просто слишком быстро происходит перед исчезновением правильного варианта. А нет. Неправильный вариант тоже не выносится...)
Я вторую глобальную переменную попыталась.. а не работает..
Код:
from tkinter import *
root = Tk()

canv = Canvas(root, width = 1040, height = 700, bg = 'white')
canv.pack()

first_item = None
second_item = None

def click(event): 
    global first_item
    global second_item

    item = canv.find_closest(event.x, event.y)[0]
   
    if event.x < 520:
        canv.coords(item, 300, 200)
        first_item = (item, *canv.coords(item))
    else:
        canv.coords(item, 300, 250)
        second_item = (item, *canv.coords(item))  
 
    if canv.gettags(first_item[0])[0] == canv.gettags(second_item[0])[0]:
        canv.delete(first_item[0])
        canv.delete(second_item[0])
    else:
         canv.coords(*first_item)
         canv.coords(*second_item)

canv.create_text(61, 101, text = "Норвегия", anchor = "nw", tag = "Норвегия")
canv.create_text(61, 146, text = "Финляндия", anchor = "nw", tag = "Финляндия")
canv.create_text(525, 101, text = "Осло", anchor = "nw", tag = "Норвегия")
canv.create_text(525, 146, text = "Хельсинки", anchor = "nw", tag = "Финляндия")

canv.bind('<1>', click)
   
root.mainloop()
ПРО77 вне форума Ответить с цитированием
Старый 12.10.2021, 19:21   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да, действительно, в том коде выносилась страна или город (смотря на что первое нажать), а пара к ней не выносилась, а сразу происходила проверка условия - убрать пару или вернуть на место.
Код:
from tkinter import *
root = Tk()

canv = Canvas(root, width = 1040, height = 700, bg = 'white')
canv.pack()

first_item = None
second_item = None

def check_tags():
    global first_item, second_item

    if canv.gettags(first_item[0])[0] == canv.gettags(second_item[0])[0]:
        canv.delete(first_item[0])
        canv.delete(second_item[0])
    else:
        canv.coords(*first_item)
        canv.coords(*second_item)

    first_item = None
    second_item = None

def click(event): 
    global first_item, second_item

    if first_item is not None and second_item is not None:
        pass
    else:
        item = canv.find_closest(event.x, event.y)[0]

        if first_item is None:
            first_item = (item, *canv.coords(item))
        else:
            second_item = (item, *canv.coords(item))
            root.after(1000, check_tags)

        if event.x < 520:
            canv.coords(item, 300, 200)
        else:
            canv.coords(item, 300, 250)

canv.create_text(61, 101, text = "Норвегия", anchor = "nw", tag = "Норвегия")
canv.create_text(61, 146, text = "Финляндия", anchor = "nw", tag = "Финляндия")
canv.create_text(525, 101, text = "Осло", anchor = "nw", tag = "Норвегия")
canv.create_text(525, 146, text = "Хельсинки", anchor = "nw", tag = "Финляндия")

canv.bind('<1>', click)
   
root.mainloop()
Вот так проверка будет через 1 секунду после выбора 2 объектов. Но еще остается проблема - можно выбрать 2 страны или 2 города, и они наложатся друг на друга.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в проекте на python tkinter Дмитрий78654 Python 3 06.03.2021 13:45
Python/PyQt5/PostgreSQL/Tkinter C_i_K_a_D_a Python 1 20.06.2019 20:45
Калькулятор на Python. Библиотека tkinter Bob123 Python 2 29.12.2017 17:20