2016-01-06 5 views
0

Я пытаюсь построить IA с графическим интерфейсом с Tkinter, но когда я запускаю свой код, напишите что-нибудь в пространстве пользователя и нажмите Enter, я получил эту ошибку :Ошибка Tcl в Tkinter «Недопустимое имя команды»

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python33\lib\tkinter\__init__.py", line 1482, in __call__ 
    return self.func(*args) 
    File "C:\Users\Ilan\Desktop\Python\ProjetIa\IA 2.0\GUI.pyw", line 53, in Enter_pressed 
    self.text.config(state='normal') 
    File "C:\Python33\lib\tkinter\__init__.py", line 1270, in configure 
    return self._configure('configure', cnf, kw) 
    File "C:\Python33\lib\tkinter\__init__.py", line 1261, in _configure 
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 
_tkinter.TclError: invalid command name ".56241624.56241736" 

Это мой код

GUI:

from tkinter import * 
from tkinter import font 

input_get = "" 
ia_answers = "" 

class TextFrame(Frame): 
    def __init__(self, window, **kwargs): 
    """Init the main top frame who contains the discussion""" 
    LabelFrame.__init__(self, window, text="Discussion",borderwidth = 15, height = 200, width = 200) 
    self.pack(fill=BOTH, side=TOP, expand = True) 

    # Font options 
    self.printopt = font.Font(family = "Times") 

    # Create the Text widget, who contains the discussion, it is append by the Enter_pressed function 
    self.text = Text(self, state='disabled', bg ="grey") 
    self.text.pack(fill = BOTH, expand = True, side = "left") 

    # Tag for the justify options on the text 
    self.text.tag_configure("right", justify="right", font=self.printopt) 
    self.text.tag_configure("left", justify="left", font=self.printopt) 

    # Put the Scrollbar and his options 
    self.scr = Scrollbar(self) 
    self.scr.config(command=self.text.yview) 
    self.text.config(yscrollcommand=self.scr.set) 
    self.scr.pack(side="right", fill="y", expand=False) 

class InputFrame(TextFrame): 
    def __init__(self, window, **kwargs): 
    """Init the main bottom frame who contains the user input box """ 

    # Import the parent class (Textframe)modules 
    TextFrame.__init__(self,window) 
    LabelFrame.__init__(self, window, text="User :", borderwidth=4) 
    self.pack(fill=BOTH, side=BOTTOM) 

    # Create the input box for the user 
    self.input_user = StringVar() 
    self.input_field = Entry(self) 
    self.input_field.pack(fill=BOTH, side=BOTTOM) 

    def Enter_pressed(event): 
    """Took the current string in the Entry field.""" 
    # Take the globals variables 
    global input_get 
    global ia_answers 
    # Take the input of the user in the input box 
    self.input_get = self.input_field.get() 
    self.input_field.delete(0, 1000) 
    # Put the text in state normal then add the variables finally put it in disabled mode 
    self.text.config(state='normal') 
    self.text.insert("end", "\n"+input_get+"\n", "left") 
    self.text.insert("end", "\n"+ia_answers+"\n", "right") 
    self.text.config(state='disabled') 
    # Scroll automatically to the bottom of the window 
    self.text.yview(END) 
    self.input_field.bind("<Return>", Enter_pressed) 

И это мой скриптом

Mainscript:

import GUI 
from GUI import * 
from tkinter import * 
window = Tk() 
TextFrame(window) 
InputFrame(window) 
window.mainloop() 

Благодарим вас заранее. Ilan

+0

внутри 'TextFrame .__ init__' вам нужно вызвать' Frame .__ init__', а не 'LabelFrame .__ init__', потому что вы определяете' class TextFrame (Frame) '. Внутри 'InputFrame .__ init__' вам нужно вызывать только' TextFrame .__ init__', потому что вы объявляете 'class InputFrame (TextFrame)' – furas

+0

Я пробовал, и он не выглядит так, как должен, у меня есть два кадра и поле ввода отдельно , –

+0

ваши классы выглядят странно - все это '__init__'. Если вам нужен «LabelFrame» в другом классе, вы можете вызвать «LabelFrame (...)». – furas

ответ

1

Проблема заключается в том, что вы неправильно строите свои классы. Посмотрите на этот код:

class TextFrame(Frame): 
    def __init__(self, window, **kwargs): 
    ... 
    LabelFrame.__init__(self, window, text="Discussion",borderwidth = 15, height = 200, width = 200) 
    ... 

Вы унаследованный от Frame, но вызываете конструктор LabelFrame. Это не вызывает проблемы, но это неверно и должно быть исправлено. Вам нужно либо наследовать от LabelFrame, либо вызвать конструктор Frame.

Кроме того, посмотрите на этот код:

class InputFrame(TextFrame): 
    def __init__(self, window, **kwargs): 
    ... 
    TextFrame.__init__(self,window) 
    LabelFrame.__init__(self, window, text="User :", borderwidth=4) 
    ... 

В приведенном выше коде, вы унаследовали от TextFrame и правильно вызвать конструктор для TextFrame, но вы также вызов конструктора для LabelFrame. Этот вызов LabelFrame.__init__ является причиной ошибки invalid command name. Вам нужно удалить эту строку кода.

Однако неясно, действительно ли вы наследуете от TextFrame, или если вы намерены наследовать от LabelFrame. Какой бы вы ни наследовали, вам нужно вызвать метод __init__ этого класса.

+0

Спасибо за ответ, но когда я нажимаю Enter, у меня есть ошибка _Attribute: объект 'InputFrame' не имеет атрибута 'text'_. Я пробовал несколько вещей, но, похоже, это не работает, ответ, безусловно, прямо передо мной, но я не вижу его. –

+0

@IlanRossler: это совершенно другая проблема. Ошибка должна быть понятной. Класс 'InputText' явно не имеет атрибута с именем' text'. –

+0

: Итак, как я могу получить доступ к текстовому виджету, который находится в другом классе? Если я написал 'class InputFrame (TextFrame)', почему я не могу получить к нему доступ? –

Смежные вопросы