Как использовать функцию python eval () для текстового окна tkinter? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть этот код, который по сути создает калькулятор.Калькулятор основан на функции eval (), чтобы оценить ввод в текстовое поле.

 from tkinter import *

 tkinter = Tk()

 text = Text(tkinter, font = ('Helvetica', 50), height = 2, width = 20)
 text.grid(row = 0, column = 0, columnspan = 4)
 def createbutton(number, name, commandname, gridx, gridy):
     def commandname():
         text.insert(END, number)
     name = Button(tkinter, command = commandname, text = number, width = 
 33, height = 4)
     name.grid(row = gridx, column = gridy)
 createbutton('0', 'button0', 'command0', 1, 1)
 createbutton('1', 'button1', 'command1', 1, 2)
 createbutton('2', 'button2', 'command2', 1, 3)

 createbutton('3', 'button3', 'command3', 2, 1)
 createbutton('4', 'button4', 'command4', 2, 2)
 createbutton('5', 'button5', 'command5', 2, 3)

 createbutton('6', 'button6', 'command6', 3, 1)
 createbutton('7', 'button7', 'command7', 3, 2)
 createbutton('8', 'button8', 'command8', 3, 3)

 createbutton('9', 'button9', 'command9', 4, 2)

 createbutton('+', 'additionbutton', 'additioncommand', 4, 1)
 createbutton('-', 'subtractionbutton', 'subtractioncommand', 4, 3)
 createbutton('*', 'multiplicationbutton', 'multiplicationcommand', 5, 1)
 createbutton('÷', 'divisionbutton', 'divisioncommand', 5, 3)

 def equals():
     global evaluate
     evaluate = eval(text)
     text.delete(1.0, END)
     text.insert(END, str(evaluate))

 equalbutton = Button(tkinter, command = equals, text = '=', width = 33, 
 height = 4)
 equalbutton.grid(row = 5, column = 2)

Функция exec () выдает точно такую ​​же ошибку,

TypeError: eval () arg 1 должен быть строкой, байтами или объектом кода

Любая помощьценится, спасибо!

Ответы [ 5 ]

0 голосов
/ 05 февраля 2019

Это потому, что в eval() вы передаете экземпляр класса Tkinter.Text.Я думаю, что вы хотите передать содержимое текстового поля, вы получите содержимое, подобное этому text.get(1.0, "end-1c"), которое вернет вам содержимое в виде строки, поэтому вы должны сделать evaluate = eval(text.get(1.0, "end-1c"))

0 голосов
/ 05 февраля 2019

Это потому, что ваша text в вашей функции eval - это ваш текстовый виджет, а на самом деле вы хотите вводить данные внутри этого виджета.Вместо text вы можете попробовать с text.get("1.0","end-1c").

Первая часть, 1.0 означает, что ввод должен быть прочитан из первой строки, символ ноль.end-1c означает чтение до тех пор, пока не будет достигнут конец текстового поля, без последнего символа, являющегося символом разрыва строки.

0 голосов
/ 05 февраля 2019

Как предполагает исключение,

TypeError: eval() arg 1 must be a string, bytes or code object

Вы должны передать строку, байты или кодовый объект в качестве параметра eval.Но в настоящее время вы передаете Text объект виджета.

Итак, чтобы работать так, как вы ожидали, получите значение из виджета Text, используя get.

evaluate = eval(text.get("1.0", tk.END))
0 голосов
/ 05 февраля 2019

text - это объект Text, а не строка, поэтому вы не можете напрямую передать его в eval.

. Вам нужно получить текст, показанный в объекте Text:используя get, затем передайте его eval

evaluate = eval(text.get(1.0, END))
0 голосов
/ 05 февраля 2019

Проблема с вашим кодом в том, что вы передаете eval сам текстовый виджет, а не его значение.Вы должны использовать метод .get(), чтобы получить значение из вашего текстового виджета, и только затем использовать .eval() для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...