Вызов метода из класса из другого файла приводит к странной ошибке в tkinter

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я пытаюсь вызвать метод display_message из client.py файла, и по какой-то причине он возвращает странную ошибку. Я запускаю тот же метод из того же файла, и он отлично работает.

Ошибка

 Traceback (most recent call last):

  File "client.py", line 2, in <module>
    app.display_message("hello")
  File "/Users/Neo630/Desktop/PyChat/gui.py", line 34, in display_message
    self.message_area.insert(INSERT, message   "n")
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 3269, in insert
    self.tk.call((self._w, 'insert', index, chars)   args)
_tkinter.TclError: invalid command name ".!frame2.!text"
  

Метод отображает текст в текстовом виджете в tkinter.

Это gui.py где существует метод.

 from tkinter import *

class App:
    def __init__(self, master):
        self.master = master

        master.title("PyChat")
        master.geometry("800x500")
        master.configure(bg="grey")

        master.grid_columnconfigure((0,1,2), uniform="uniform", weight=1)
        master.grid_rowconfigure(0, weight=1)

        self.friends_space = Frame(master, bg="red")
        self.friends_space.grid(row=0, column=0, sticky=NSEW)

        self.chat_space = Frame(master, bg="blue")
        self.chat_space.grid(row=0, column=1, columnspan=3, sticky=NSEW)

        self.message_area = Text(self.chat_space, width=1, height=1)
        self.message_area.pack(fill=BOTH, expand=True, side=TOP, padx=10, pady=10)

        self.message_input = Entry(self.chat_space)
        self.message_input.pack(fill=X, side=BOTTOM, padx=10, pady=(0,10))
        self.message_input.bind('<Return>', self.get_message_input)


    def get_message_input(self, event):
        global message
        message = self.message_input.get()
        self.message_input.delete(0, END)

    def display_message(self, message):
        self.message_area.insert(INSERT, message   "n")
        self.message_area.see(END)


root = Tk()
app = App(root)
app.display_message("This is from gui.py")
root.mainloop()
  

Это client.py где я пытаюсь вызвать метод

 import gui

gui.app.display_message("this is from client.py")
  

Ответ №1:

При использовании import gui .

Код в конце будет выполнен:

 root = Tk()
app = App(root)
app.display_message("This is from gui.py")
root.mainloop()
  

Но после того, как вы закроете окно, mainloop() end, оно будет запущено gui.app.display_message("this is from client.py") .Но в это время это окно (фрейм тоже) было уничтожено.Вот почему он показал ошибку.


Измените код в gui.py:

 if __name__ == '__main__':
    root = Tk()
    app = App(root)
    app.display_message("This is from gui.py")
    root.mainloop()
  

И код в client.py :

 import gui
import tkinter as tk

root = tk.Tk()
app = test.App(root)
app.display_message("this is from client.py")
root.mainloop()
  

Возможно, приведенное ниже изменение не то, что вы хотите, вы также можете попробовать:

Код в gui.py (не использовать mainloop() ):

 root = Tk()
app = App(root)
app.display_message("This is from gui.py")
  

И код в client.py :

 import gui
import tkinter as tk

test.app.display_message("this is from client.py")
test.root.mainloop()
  

При этом в графическом интерфейсе будут отображаться два сообщения.
введите описание изображения здесь