2013-06-21 3 views
-4

Я новичок в создании GUI-создания python, и я пытался сделать калькулятор.
До сих пор я разработал внешний вид и сделал возможным, чтобы при нажатии клавиши его метка отображается в текстовом поле ввода, но то, что я не могу сделать, например, при вводе 789 x 789, как получить результат это будет отображаться в текстовом поле ввода.
Link to my code:Python GUI Calculator он нужен lp

+2

плохое место, чтобы разместить свой код ... хром Wouldnt позвольте мне пойти туда –

+0

я рекомендовал бы разместить код непосредственно на StackOverflow. Если он слишком большой, то оставьте части, которые не имеют значения для вопроса, который вы задаете. –

+0

Похоже, это не вопрос GUI ... Вы действительно должны справиться со всем этим, когда получите ввод. текстовое поле - это просто дисплей, но если вы действительно хотите его использовать, вам нужно будет прочитать текст и проанализировать его, но это действительно круговое и не очень эффективное наблюдение, поскольку вы сначала получаете данные ... – Fry

ответ

1

Если вы действительно хотите использовать текст в текстовом поле (и с небольшой ловкостью я думаю это минимальное усилие-путь) будет использовать eval() по тексту. Конечно, требуется какая-то модификация. Вам нужно использовать * вместо x для умножения, а log и sqrt должны eval текст сначала, вычислить, а затем записать результат.

Слово предупреждения, кстати. Никогдаevalлюбой фрагмент текста, которому вы не доверяете полностью. Это открывает всевозможные проблемы безопасности. (Подумайте, например, eval("os.system('rm -rf /')")). И даже если вы считаете, что можете сделать текст, предоставленный пользователем, безопасным, есть several pitfalls.

Редактировать: Разместите это здесь, чтобы все могли видеть. Как уже упоминалось в комментариях, вам явно необходимо отключить прямой ввод в текстовое поле, так что только кнопки могут влиять на его содержимое. textbox.set_overwrite_mode(False) должен выполнить это.

+0

Можете ли вы объяснить мне что-то об eval() для меня, никогда не слышали об этом. –

+0

Несомненно. 'eval' принимает выражение python как ввод (в строке) и возвращает результат вычисления этого выражения. Так, например, 'eval (" 1337-42 ")' возвращает 1295. Таким образом, если текстовое поле содержит арифметическое выражение, вы можете взять этот текст, передать его в 'eval' и вернуть результат (в виде числа). Но, конечно, это должно быть допустимое арифметическое выражение в python. –

+0

ok, так что в основном вы говорите, что eval get является строкой, и если это допустимое арифметическое выражение возвращает результат как число? Ну, спасибо за это, я узнал что-то новое, и я собираюсь попробовать это на своем калькуляторе. –

1

Я думаю, что это то, что вы хотите

class Calc: 
    numbers = [] 
    operators = [] 
    ... 
    def pressed(self,widget): #This functions makes possible that the label of a button is displayed in the textbox when that button is pressed 
      num = self.textbox.get_text() 
      pnum = widget.get_label() 
      result = "" 
      if pnum in "1234567890.": 
       self.textbox.set_text(num + pnum) 
       return 
      elif pnum == "x": 
       self.numbers.append(float(num)) 
       self.operators.append(operator.mul) 
      elif pnum == "+": 
       self.numbers.append(float(num)) 
       self.operators.append(operator.add) 
      elif pnum == "-": 
       self.numbers.append(float(num)) 
       self.operators.append(operator.sub) 
      elif pnum == "/": 
       self.numbers.append(float(num)) 
       self.operators.append(operator.div) 
      elif pnum == "sqrt": 
       self.numbers.append(float(num)**0.5) 
      elif pnum == "=": 
       self.numbers.append(float(num)) 
       for op in self.operators: 
        self.numbers.insert(0, op(self.numbers.pop(0),self.numbers.pop(0))) 
       result = str(self.numbers[0]) 

      self.textbox.set_text(result) 
+0

Я получаю сообщение о том, что глобальные номера имен не определены –

+0

oops вам нужно поместить их в пространство классов .... (отредактированный ответ) –

+0

убедитесь, что вы используете пробелы или вкладки, не смешивая их (копирование/вставка может делайте забавные вещи с пустыми символами) –

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