Я не могу понять эту ошибку Tkinter - PullRequest
0 голосов
/ 21 августа 2011

Я использую Python Tkinter для создания графического интерфейса для проекта, над которым я работаю.

Когда я пытаюсь выполнить часть кода, я получаю эту ошибку:

Traceback (most recent call last):
  File "calculator.py", line 59, in <module>
    app = Application()
  File "calculator.py", line 28, in __init__
    self.create_widgets()
  File "calculator.py", line 45, in create_widgets
    self.special_chars.create_button(char, self.add_char_event(special_characters[char]))
  File "calculator.py", line 20, in create_button
    self.button_list += Button(self, text = txt, command = fcn)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
lib-tk/Tkinter.py", line 1206, in cget
TypeError: cannot concatenate 'str' and 'int' objects

Проблема в том, что я не могу найти файл, на который ссылается сообщение об ошибке;Моя папка python2.7/lib-tk содержит только соответствующие версии (.pyo и .pyc) Tkinter.

Есть ли способ выяснить, что происходит не так?

Вот источник calculator.py

from Tkinter import *
from exp import full_eval
from maths import special_characters

class special_char_frame(LabelFrame):
    def __init__(self, master = None, text = 'Special Characters'):
        LabelFrame.__init__(self, master)
        self.grid()
        self.button_list = []
    def create_button(self, txt, fcn):
        self.button_list += Button(self, text = txt, command = fcn)
        self.button_list[-1].grid(row = 0)


class Application(Frame):
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()
    def create_widgets(self):
        ## equation entry pane
        self.text_entry = Entry(self, width = 100)
        self.text_entry.grid(row = 0, column = 0)
        self.text_entry.bind('<KeyPress-Return>', self.calculate)
        ## result pane
        self.result = StringVar()
        self.result_label = Label(self, textvariable = self.result, wraplength = 815, justify = LEFT)
        self.result_label.grid(row = 1, column = 0, columnspan = 2, sticky = W)
        self.result.set('')
        ## calculate button
        self.calc_button = Button(self, text = 'Calculate', command = self.calculate)
        self.calc_button.grid(row = 0, column = 1)
        ## special character button pane
        self.special_chars = special_char_frame(self)
        for char in special_characters:
            self.special_chars.create_button(char, self.add_char_event(special_characters[char]))
        self.special_chars.grid(column = 0, columnspan = 2, row = 2)
    def calculate(self, event = None):
        try:
            self.result.set(full_eval(self.text_entry.get()))
        except Exception as error:
            raise
            #self.result.set(str(error))
        self.text_entry.select_range(0, END)
    def add_char_event(self, char):
        def add_char(self = self, event = None):
            self.text_entry.insert(INSERT, char)
        return add_char

app = Application()
app.master.title('Calculator')
app.mainloop()

full_eval - это функция для вычисления математических выражений.

special_characters - это диктовка, содержащая специальные символы и их пояснения.Пока это просто special_characters = {'imaginary unit' : u'\u2148'}

1 Ответ

1 голос
/ 21 августа 2011

Хорошо, поэтому я пропустил это в первый раз, но проблема в том, что вы пытаетесь добавить кнопку в список:

self.button_list += Button(self, text = txt, command = fcn)

Если вы просто заключите кнопку в скобки, ошибка исчезнет (что имеет смысл, поскольку вы должны иметь возможность добавлять два списка):

self.button_list += [Button(self, text = txt, command = fcn)]

ОРИГИНАЛЬНАЯ ПОПЫТКА

Мое предположение:

special_characters - это словарь. У него есть сопоставления значения ключа, где значения int с. Затем при использовании в self.text_entry.insert(INSERT, char) text_entry пытается вставить int в str и вызывает вышеуказанную ошибку. Простое решение: обернуть char с str в add_char.

def add_char_event(self, char):
    def add_char(self = self, event = None):
        self.text_entry.insert(INSERT, str(char))
    return add_char

Другой вариант - обернуть str вокруг special_characters поиска:

    for char in special_characters:
        self.special_chars.create_button(char,
             self.add_char_event(str(special_characters[char])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...