Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Исправьте код на Python с библиотекой Tkinter, проект с использованием двух файлов

Помогите найти ошибку в моём проекте на Python. В проекте два файла: main, main2 . Основной запускаемый файл проекта: main .

Код в main:

12345678910111213141516171819202122232425262728293031323334353637383940
 from tkinter import * 
from main2 import Exit2, window2 
 
win2 = Tk() 
win2.title("???") 
win2.geometry("1600x900") 
win2.resizable(width=False, height=False) 
win2.configure(bg="black") 
 
window2() 
 
def exit(): 
    exit() 
    Exit2() 
 
lb = Label(text="Миша самый плохой!!!", font="Helvetica", fg="red", bg="black") 
lb.place(x=500, y=30) 
lb.pack 
 
def changeText(): 
    lb.configure(text="Вернее, Максим плохой") 
 
bt = Button(text="Нажми сюда", fg="black", bg="red", width=16, command=changeText) 
bt.place(x=500, y=10) 
bt.pack 
 
def createLabel(): 
    lb2 = Label(text="Нюша плохая птичка!!!", font="Helvetica", fg="red", bg="black") 
    lb2.place(x=200, y=60) 
    lb2.pack() 
 
bt2 = Button(text="И сюда нажми!", fg="black", bg="red", width=16, command=createLabel) 
bt2.place(x=100, y=30) 
bt2.pack() 
 
lb3 = Label(text="Нажми на все кнопки!", font="Helvetica", fg="red", bg="black") 
lb3.place(x=600, y=20) 
lb3.pack() 
 
win2.mainloop() 

и ещё просто исправьте код, не спрашивайте про тексты.

код в main2:

1234567891011121314
 from tkinter import * 
 
def Exit2(): 
    exit() 
 
def window2(): 
    win3 = Tk() 
    win3.title("Нажми на все кнопки!") 
    win3.geometry("100x100") 
    win3.resizable(width=False, height=False) 
    win3.configure(bg="black") 
 
    win3.mainloop() 
 


и при запуске программы пишет:
Traceback (most recent call last):
File "d:\pdwaosdnwaindwiadnwaidnwaidn\main.py", line 2, in <module>
from main2 import Exit2, window2
ImportError: cannot import name 'Exit2' from 'main2' (d:\pdwaosdnwaindwiadnwaidnwaidn\main2.py)

По дате
По рейтингу
Аватар пользователя
Оракул

Ошибка возникает из-за того, что функция exit() в Python используется для завершения работы всей программы, а не только для закрытия окна. При импорте из main2 Python пытается найти функцию Exit2, но сталкивается с вызовом exit(), который завершает весь процесс импорта.
Чтобы исправить ошибку, нужно:
1. Изменить имена функций exit и Exit2 на что-то другое, например, close_window и close_window2, чтобы избежать конфликта с встроенной функцией exit().
2. Использовать win3.destroy() для закрытия окна win3.
Вот исправленный код:
main.py:
from tkinter import *
from main2 import close_window2, window2

win2 = Tk()
win2.title("???")
win2.geometry("1600x900")
win2.resizable(width=False, height=False)
win2.configure(bg="black")

window2()

def close_window():
win2.destroy()
close_window2()

lb = Label(win2, text="Миша самый плохой!!!", font="Helvetica", fg="red", bg="black")
lb.pack() # используйте pack() только один раз для каждого виджета

bt = Button(win2, text="Нажми сюда", fg="black", bg="red", width=16, command=lambda: lb.config(text="Вернее, Максим плохой"))
bt.pack()

def createLabel():
lb2 = Label(win2, text="Нюша плохая птичка!!!", font="Helvetica", fg="red", bg="black")
lb2.pack()

bt2 = Button(win2, text="И сюда нажми!", fg="black", bg="red", width=16, command=createLabel)
bt2.pack()

lb3 = Label(win2, text="Нажми на все кнопки!", font="Helvetica", fg="red", bg="black")
lb3.pack()

win2.protocol("WM_DELETE_WINDOW", close_window) # вызов функции при закрытии окна
win2.mainloop()

main2.py:
from tkinter import *

def close_window2():
global win3 # обращаемся к глобальной переменной win3
win3.destroy()

def window2():
global win3 # объявляем win3 как глобальную переменную
win3 = Tk()
win3.title("Нажми на все кнопки!")
win3.geometry("100x100")
win3.resizable(width=False, height=False)
win3.configure(bg="black")
win3.protocol("WM_DELETE_WINDOW", close_window2) # вызов функции при закрытии окна
win3.mainloop()

Изменения:
• Функции exit и Exit2 переименованы в close_window и close_window2.
• В функциях close_window и close_window2 используется win2.destroy() и win3.destroy() соответственно для закрытия окон.
• В main2.py переменная win3 объявлена как глобальная, чтобы к ней можно было обратиться из функции close_window2.
• Использование pack() для позиционирования виджетов ограничено одним разом на виджет.
• Добавлена обработка события закрытия окна с помощью protocol("WM_DELETE_WINDOW", close_window).
Теперь код должен работать корректно и закрывать оба окна без ошибок.

Аватар пользователя
Мудрец

накуй тебе exit2 если у него в логике просто одна функция?

вот окно это, ниче не менял

Аватар пользователя
Профи

Main

1234567891011121314151617181920212223242526272829303132333435
 from tkinter import * 
import main2 
 
def main(): 
    win2 = Tk() 
    win2.title("???") 
    win2.geometry("1600x900") 
    win2.resizable(False, False) 
    win2.configure(bg="black") 
 
    main2.window2() 
 
    lb = Label(win2, text="Миша самый плохой!!!", font="Helvetica", fg="red", bg="black") 
    lb.pack() 
 
    def changeText(): 
        lb.configure(text="Вернее, Максим плохой") 
 
    bt = Button(win2, text="Нажми сюда", fg="black", bg="red", width=16, command=changeText) 
    bt.pack() 
 
    def createLabel(): 
        lb2 = Label(win2, text="Нюша плохая птичка!!!", font="Helvetica", fg="red", bg="black") 
        lb2.pack() 
 
    bt2 = Button(win2, text="И сюда нажми!", fg="black", bg="red", width=16, command=createLabel) 
    bt2.pack() 
 
    lb3 = Label(win2, text="Нажми на все кнопки!", font="Helvetica", fg="red", bg="black") 
    lb3.pack() 
 
    win2.mainloop() 
 
if __name__ == "__main__": 
    main() 

main 2

12345678910
 from tkinter import * 
 
def window2(): 
    win3 = Toplevel()  # Используем Toplevel для создания дочернего окна 
    win3.title("Нажми на все кнопки!") 
    win3.geometry("100x100") 
    win3.resizable(False, False) 
    win3.configure(bg="black") 
 
    win3.mainloop() 
Аватар пользователя
Профи

Main 1
from tkinter import *
from main2 import Exit2, window2

win2 = Tk()
win2.title("Основное окно")
win2.geometry("1600x900")
win2.resizable(width=False, height=False)
win2.configure(bg="black")

window2()

def exit_app(): # Изменено имя функции
win2.destroy() # Закрытие главного окна
Exit2() # Закрытие дополнительного окна

lb = Label(win2, text="Миша самый плохой!!!", font="Helvetica", fg="red", bg="black")
lb.place(x=500, y=30)
lb.pack() # Исправлено

def changeText():
lb.configure(text="Вернее, Максим плохой")

bt = Button(win2, text="Нажми сюда", fg="black", bg="red", width=16, command=changeText)
bt.place(x=500, y=10)
bt.pack()

def createLabel():
lb2 = Label(win2, text="Нюша плохая птичка!!!", font="Helvetica", fg="red", bg="black")
lb2.place(x=200, y=60)
lb2.pack()

bt2 = Button(win2, text="И сюда нажми!", fg="black", bg="red", width=16, command=createLabel)
bt2.place(x=100, y=30)
bt2.pack()

lb3 = Label(win2, text="Нажми на все кнопки!", font="Helvetica", fg="red", bg="black")
lb3.place(x=600, y=20)
lb3.pack()

win2.mainloop()
Main 2
from tkinter import *

def Exit2():
win3.destroy() # Изменено на destroy для корректного закрытия окна

def window2():
global win3 # Добавлено для доступа к win3 извне функции
win3 = Toplevel() # Изменено на Toplevel для создания дополнительного окна
win3.title("Нажми на все кнопки!")
win3.geometry("100x100")
win3.resizable(width=False, height=False)
win3.configure(bg="black")

win3.mainloop()

Аватар пользователя
Искусственный Интеллект

main

12345678910111213141516171819202122232425262728293031323334353637
 
from tkinter import * 
from main2 import Exit2, window2 
 
win2 = Tk() 
win2.title("Главное окно") 
win2.geometry("1600x900") 
win2.resizable(width=False, height=False) 
win2.configure(bg="black") 
 
window2() 
 
def exit_program(): 
    win2.destroy() 
    Exit2() 
 
lb = Label(win2, text="Миша самый плохой!!!", font="Helvetica", fg="red", bg="black") 
lb.pack() 
 
def changeText(): 
    lb.configure(text="Вернее, Максим плохой") 
 
bt = Button(win2, text="Нажми сюда", fg="black", bg="red", width=16, command=changeText) 
bt.pack() 
 
def createLabel(): 
    lb2 = Label(win2, text="Нюша плохая птичка!!!", font="Helvetica", fg="red", bg="black") 
    lb2.pack() 
 
bt2 = Button(win2, text="И сюда нажми!", fg="black", bg="red", width=16, command=createLabel) 
bt2.pack() 
 
lb3 = Label(win2, text="Нажми на все кнопки!", font="Helvetica", fg="red", bg="black") 
lb3.pack() 
 
win2.mainloop() 
 

main2

123456789101112131415
 
from tkinter import * 
 
def Exit2(): 
    exit() 
 
def window2(): 
    win3 = Tk() 
    win3.title("Нажми на все кнопки!") 
    win3.geometry("100x100") 
    win3.resizable(width=False, height=False) 
    win3.configure(bg="black") 
 
    win3.mainloop()