_tkinter.TclError: invalid command name ".!canvas" Ошибка с функцией
В общем, проблема в том, что у меня возникает ошибка _tkinter.TclError: invalid command name ".!canvas". Я абсолютно не понимаю, почему именно она возникает. Я смотрел другие решения данной проблемы, там говорят про "mainloop", хотя, казалось бы, он у меня есть, но проблема у меня остаётся.
Смысл программы в том, чтобы вводить название государства в соответствующем окне и нажать на кнопку, после чего высветится информация о данной стране и её местоположение на карте (будет вставляться другая карта, заместо старой).
Возможно, что часть кода действует вне "mainloop", но если это даже и так, то у меня нету идей, как это исправить.
Вот весь программный код:
from tkinter import Tk, Canvas, Button
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext
from tkinter.ttk import Combobox
from tkinter.ttk import *
import io
from tkinter import font
from pathlib import Path
from PIL import Image
import os
import sys
#-------------------------------Лаунчер--------------------------------------------------------------
winL=Tk()
winL.geometry("400x500") #Размер окна ("1500x900" - IT-Куб) /1,25
winL.title("Размер окна программы")
winL.configure(bg="lightblue") #lightblue - светло-синий
winL.resizable(width=False,height=False)
#__________________________--СТРАНЫ--_________________________________________________________
#---------Списки------------------------------------------------------------------------------
List_Stran_OSNOVA = ["Австрия" , #1
"Албания", #2
"Андорра",
"Другие"] #47
List_Stran_Show = '''----А----
Австрия
Албания
Андорра
''' #47
#----------Функции стран-----------------------------------------------------------
def Austria(): #1
global img_kart_put, window1, KARTA_OSNOVA
if Mashtab=="1280x800":
canva.delete(KARTA_OSNOVA)
img_kart_put="Карта Европы/AustriaMap_for_1280.png"
img_kart_put_img = PhotoImage(file= Path(img_kart_put).absolute(), master=window1)
KARTA_OSNOVA=canva.create_image(400*Masht_obv_x_MN, 420*Masht_obv_y_MN, anchor=CENTER, image=img_kart_put_img)
#print (img_kart_put)
#window1.mainloop()
return KARTA_OSNOVA
def Albania(): #2
pass
def Andorra():
pass
def Other(): #4
pass
#------------ВСЁ ОСТАЛЬНОЕ---------------------------------------------------------
img_kart_put="" # - Карта
Mashtab="300x300"#масштаб окна программы
MashT=""#Переменная для определения "16:9" и "16:10"
Masht_obv_x_MN=1
Masht_obv_y_MN=1
POISK_Stran_IMG=""
FONT_List_country=""
#MNOJITELь=0,59296875 #0,593
#ФУНКЦИИ размеров окна основной программы
#16:10 - функции
def com_1280x800():
global Mashtab, MashT, img_kart_put, POISK_Stran_IMG
global FONT_Entry_country, FONT_List_country
global Masht_obv_x_MN, Masht_obv_y_MN
Masht_obv_x_MN=1280/1280 #1
Masht_obv_y_MN=800/800
FONT_Entry_country="Arial 25"
FONT_List_country="TimesNewRoman 15"
Mashtab="1280x800"
MashT="16:10"
img_kart_put="Карта Европы/EuroMap_for_1280.png" #\
POISK_Stran_IMG='Кнопки/POISK_Stran_50x50R.png'
return Mashtab, MashT, img_kart_put, Masht_obv_x_MN, Masht_obv_y_MN, FONT_Entry_country, POISK_Stran_IMG, FONT_List_country
#16:9 функции
def com_1280x720():
global Mashtab, MashT, img_kart_put, POISK_Stran_IMG
global FONT_Entry_country, FONT_List_country
global Masht_obv_x_MN, Masht_obv_y_MN
Masht_obv_x_MN=1280/1280 #1
Masht_obv_y_MN=720/720
FONT_Entry_country="Arial 23"
FONT_List_country="TimesNewRoman 15"
Mashtab="1280x720"
MashT="16:9"
img_kart_put="Карта Европы/EuroMap_for_1280.png"
POISK_Stran_IMG='Кнопки/POISK_Stran_45x45R.png'
return Mashtab, MashT, img_kart_put, Masht_obv_x_MN, Masht_obv_y_MN, FONT_Entry_country, POISK_Stran_IMG, FONT_List_country
def com_POISK_Stran():
global Entry_country
value_Entry=Entry_country.get()
if value_Entry==List_Stran_OSNOVA[0]: #1
Austria()
elif value_Entry==List_Stran_OSNOVA[1]: #2
Albania()
elif value_Entry==List_Stran_OSNOVA[2]:
Andorra()
elif value_Entry==List_Stran_OSNOVA[3]: #4
Other()
return value_Entry
def com_List_Stran():
color="grey"
window2=Tk()
window2.geometry("400x500")
window2.title("Государства Европы")
window2.configure(bg=color)
window2.resizable(width=False,height=False)
Scroll_List_Stran=scrolledtext.ScrolledText(window2, width=60, height=50, font="TimesNewRoman 15" )
Scroll_List_Stran.insert(INSERT, List_Stran_Show)
Scroll_List_Stran.configure(state ='disabled')
Scroll_List_Stran.pack()
window2=mainloop()
def com_OPEN():
global img_kart_put, Entry_country, window1, KARTA_OSNOVA
if MashT=="16:9":
winL.destroy()
#-------------------------------Основа--------------------------------------------------------------
# Создаём окно
color="grey"
window1=Tk()
window1.geometry(Mashtab) #Размер окна ("1500x900" - IT-Куб) /1,25 1280x720
window1.title("IT-География")
window1.configure(bg=color) #lightblue - светло-синий
window1.resizable(width=False,height=False)
#---------------------------------------------------------------------------------------------------
canva=Canvas(window1, width=10000, height=7200, bg=color) #Создание холста (1500, 900)
canva.pack() #Закрепление холста
#---------------------Информация и поиск по странам
canva.create_rectangle(800*Masht_obv_x_MN,100*Masht_obv_y_MN,1270*Masht_obv_x_MN,700*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5) #здесь будет информация о стране
# 800 100 1270 700
canva.create_rectangle(800*Masht_obv_x_MN,10*Masht_obv_y_MN,1270*Masht_obv_x_MN,95*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5) #Здесь будет название страны
# 800 10 1270 95
#---------------------------------------------------------------------------------------------------
canva.create_rectangle(75*Masht_obv_x_MN,15*Masht_obv_y_MN,725*Masht_obv_x_MN,75*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5)
#75 15 725 95
Entry_country=Entry(textvariable=StringVar(),font=FONT_Entry_country)
Entry_country.place(x=90*Masht_obv_x_MN, y=25*Masht_obv_y_MN, width=400*Masht_obv_x_MN)
#90 35 500
#-Кнопки-----------------------------------------------------------------------------------------------
#Кнопка поиска страны
POISK_Stran_img = PhotoImage(file=Path(POISK_Stran_IMG).absolute(), master=window1)
button_POISK_Stran = tk.Button(window1, image=POISK_Stran_img, command=com_POISK_Stran)
button_WindPOISK_Stran = canva.create_window(520*Masht_obv_x_MN, 46*Masht_obv_y_MN, window=button_POISK_Stran)
#525 57
#Кнопка открытия списка существующих стран Европы
button_List_Stran = tk.Button(window1, text="Список стран", font=FONT_List_country, command=com_List_Stran,height=int(1*Masht_obv_y_MN)) # "TNM_15", height=1
button_List_Stran.configure(width=int(14*Masht_obv_x_MN)) #12
button_WindList_Stran = canva.create_window(635*Masht_obv_x_MN, 45*Masht_obv_y_MN, window=button_List_Stran)
#635 57
#Вставляем карту Европы
canva.create_rectangle(75*Masht_obv_x_MN,85*Masht_obv_y_MN,725*Masht_obv_x_MN,708*Masht_obv_y_MN, fill="lightgrey",outline="black", width=5) #Это квадрат для обводки карты
# +1 +1 -1 -1
# 20 87 780 847
# 75 65 725 693
# 75 85 725 708
img_kart_put_img = PhotoImage(file= Path(img_kart_put).absolute(), master=window1)
canva.create_image(400*Masht_obv_x_MN, 395*Masht_obv_y_MN, anchor=CENTER, image=img_kart_put_img) #400, 395
#
window1=mainloop()
if MashT=="16:10":
winL.destroy()
#-------------------------------Основа--------------------------------------------------------------
# Создаём окно
color="grey"
window1=Tk()
window1.geometry(Mashtab) #Размер окна ("1500x900" - IT-Куб) /1,25 1280x720
window1.title("IT-География")
window1.configure(bg=color) #lightblue - светло-синий
window1.resizable(width=False,height=False)
#---------------------------------------------------------------------------------------------------
canva=Canvas(window1, width=10000, height=7200, bg=color) #Создание холста (1500, 900)
canva.pack() #Закрепление холста
#---------------------Информация и поиск по странам
canva.create_rectangle(800*Masht_obv_x_MN,100*Masht_obv_y_MN,1270*Masht_obv_x_MN,770*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5) #здесь будет информация о стране
# 800 100 1270 700
canva.create_rectangle(800*Masht_obv_x_MN,10*Masht_obv_y_MN,1270*Masht_obv_x_MN,95*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5) #Здесь будет Название страны
# 800 10 1270 95
canva.create_rectangle(75*Masht_obv_x_MN,15*Masht_obv_y_MN,725*Masht_obv_x_MN,95*Masht_obv_y_MN, fill="lightgrey",outline="darkgrey", width=5)
#75 15 725 95
Entry_country=ttk.Entry(textvariable=StringVar(),font=FONT_Entry_country)
Entry_country.place(x=90*Masht_obv_x_MN, y=35*Masht_obv_y_MN, width=400*Masht_obv_x_MN)
#90 35 500
#-Кнопки-----------------------------------------------------------------------------------------------
#Кнопка поиска страны
POISK_Stran_img = PhotoImage(file=Path(POISK_Stran_IMG).absolute(), master=window1)
button_POISK_Stran = tk.Button(window1, image=POISK_Stran_img, command=com_POISK_Stran)
button_WindPOISK_Stran = canva.create_window(525*Masht_obv_x_MN, 57*Masht_obv_y_MN, window=button_POISK_Stran)
#525 57
#Кнопка открытия списка существующих стран Европы
button_List_Stran = tk.Button(window1, text="Список стран", font=FONT_List_country, command=com_List_Stran,height=1) # "TNM_15", height=1
button_List_Stran.configure(width=12) #12
button_WindList_Stran = canva.create_window(635*Masht_obv_x_MN, 57*Masht_obv_y_MN, window=button_List_Stran)
#635 57
#---------------------------------------------------------------------------------------------------
#Вставляем карту Европы
canva.create_rectangle(75*Masht_obv_x_MN,105*Masht_obv_y_MN,725*Masht_obv_x_MN,733*Masht_obv_y_MN, fill="lightgrey",outline="black", width=5) #Это квадрат для обводки карты
# +1 +1 -1 -1
# 20 87 780 847
# 75 65 725 693
#75 105 725 733
#img_kart_put = PhotoImage(file= Path("Карта Европы\ew3_Empty_map_of_Europe.png").absolute())
img_kart_put_img = PhotoImage(file= Path(img_kart_put).absolute(), master=window1)
KARTA_OSNOVA=canva.create_image(400*Masht_obv_x_MN, 420*Masht_obv_y_MN, anchor=CENTER, image=img_kart_put_img) #400, 400
#400, 380
#400, 420
#E:\По IT-кубу\IT-География\Карта Европы\ew3_Empty_map_of_Europe.png
#
window1=mainloop()
return Entry_country, KARTA_OSNOVA
def com_CLOSE():
exit()
canva = Canvas(winL, width=500, height=600, bg="lightblue")
canva.pack()
BackGround=PhotoImage(file=Path("фон для программы/cookie.png").absolute()) #\ (на линукс: /
BC_for_Launcher=canva.create_image(0, 0, anchor="nw", image=BackGround)
canva.create_text(200,20, text="Размер окна программы", font="Arial 17", fill="black")
#16:10
canva.create_text(100,70, text="16:10", font="Arial 15", fill="black")
button_1280x800 = Button(canva, text="R_1280x800", command=com_1280x800)
button_1280x800.configure(width=15)
button_Wind1280x800 = canva.create_window(100, 100, window=button_1280x800) #1
#16:9
canva.create_text(300,70, text="16:9", font="Arial 15", fill="black")
button_1280x720 = Button(text="R_1280x720", command=com_1280x720)
button_1280x720.configure(width=15)
button_wind1280x720 = canva.create_window(300, 150, window=button_1280x720) #2
#Открытие основной программы и закрытие лаунчера (кнопки)
button_OPEN = Button(canva, text="Запустить", command=com_OPEN)
button_OPEN.configure(width=15)
button_windOPEN = canva.create_window(100, 400, window=button_OPEN) #3
button_CLOSE = Button(canva, text="Закрыть", command=com_CLOSE)
button_CLOSE.configure(width=15)
button_windCLOSE = canva.create_window(300, 400, window=button_CLOSE) #3
winL.mainloop()
Проблемная часть кода:
def Austria(): #1
global img_kart_put, window1, KARTA_OSNOVA
if Mashtab=="1280x800":
canva.delete(KARTA_OSNOVA)
img_kart_put="Карта Европы/AustriaMap_for_1280.png"
img_kart_put_img = PhotoImage(file= Path(img_kart_put).absolute(), master=window1)
KARTA_OSNOVA=canva.create_image(400*Masht_obv_x_MN, 420*Masht_obv_y_MN, anchor=CENTER, image=img_kart_put_img)
return KARTA_OSNOVA
Ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "E:\Games\Python\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "e:\По IT-кубу\IT-География\for StackOverFlow.py", line 171, in com_POISK_Stran
Austria()
File "e:\По IT-кубу\IT-География\for StackOverFlow.py", line 63, in Austria
canva.delete(KARTA_OSNOVA)
File "E:\Games\Python\lib\tkinter\__init__.py", line 2823, in delete
self.tk.call((self._w, 'delete') + args)
_tkinter.TclError: invalid command name ".!canvas"