Как я могу использовать пользовательский ввод для записи вывода, используя Tkinter? - PullRequest
0 голосов
/ 28 июня 2018

Я пытался создать код для создания графического калькулятора с кнопками и попытался найти справку Tkinter, но не смог получить помощь. Как включить закомментированный раздел внизу, чтобы отобразить значение показанных чисел? Пожалуйста, не стесняйтесь добавлять предложения в мой код.

РЕДАКТИРОВАТЬ: я исправил код, как предложено @abarnert, но когда я запускаю код, он всегда пишет неверную операцию. Я не знаю, как это исправить. Кто-нибудь есть лучшая идея, чтобы исправить мой код? Мне просто нужно заставить операцию работать. Мой отредактированный код ниже.

from math import sqrt
from tkinter import *
window = Tk()
window.title("Welcome to Calculator ")
window.configure(background = "white")
Label (window, text = "Calculator", bg = "white") .grid(row = 0, column = 
0, sticky = N)



#click function
def click():
    n = n_textentry.get()
    m = m_textentry.get()
    operation = operation_textentry.get()
    if operation == 1:
        print(n + m)

    elif operation == 2:
        print(n - m)

    elif operation == 3:
        print(n * m)

    elif operation == 4:
        print(n / m)

    elif operation == 5:
        print(n ** m)

    elif operation == 6:
        print(sqrt(n))

    else:
        print("Invalid Operation ")




#to create the box for the first number and store it
Label (window, text = "Enter the first number", bg = "white") .grid(row = 
1, column = 0, sticky = N)
n_textentry = Entry(window, width = 10, bg = "white")
n_textentry.grid(row = 2, column = 0, sticky = N)
Button(window, text = "Submit", width = 6, command=click) .grid(row = 3, 
column = 0, sticky = N)

#to create the box for the second number
Label (window, text = "Enter the second number", bg = "white") .grid(row = 
5, column = 0, sticky = N)
m_textentry = Entry(window, width = 10, bg = "white")
m_textentry.grid(row = 6, column = 0, sticky = N)
Button(window, text = "Submit", width = 6, command=click) .grid(row = 7, 
column = 0, sticky = N)

#to show list of options
Label (window, text = '''               Enter 1 for addition
                    Enter 2 for subtraction
                         Enter 3 for multiplication
              Enter 4 for division
                        Enter 5 for exponentiation

Enter 6 for square root *This will only work for 1st choice*''', bg = 
"white") .grid(row = 9, column = 0, sticky = W)

operation_textentry = Entry(window, width = 10, bg = "white")
operation_textentry.grid(row = 10, column = 0, sticky = N)
Button(window, text = "Submit", width = 6, command=click) .grid(row = 11, 
column = 0, sticky = N)

1 Ответ

0 голосов
/ 28 июня 2018

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

Например, когда пользователь нажимает эту первую кнопку Submit, он вызывает вашу функцию click. Внутри этой функции вы можете делать там что угодно.

Вы заставили все три кнопки вызывать одну и ту же функцию click. Это не имеет особого смысла.

На самом деле, зачем вам даже три отдельные кнопки? Подумайте о типичной форме в типичном графическом интерфейсе - есть множество полей ввода, а затем одна кнопка «Отправить», которую пользователь нажимает после заполнения всех полей. Итак, давайте просто отбросим первые две кнопки и в конце будем иметь только одну.

Теперь, внутри этой функции click, вы можете "делать все что угодно". Но что здесь уместно?

Первое, что вам нужно сделать - это получить значения из трех Entry полей. Но вы пытались сохранить все три из них в одной переменной, поэтому вы не можете получить доступ ко всем трем из них, только к последней. Итак, вместо того, чтобы делать это три раза:

textentry = Entry(window, width = 10, bg = "white")

... дайте им разные имена:

n_entry = Entry(window, width = 10, bg = "white")
# ...
m_entry = Entry(window, width = 10, bg = "white")
# ...
operation_entry = Entry(window, width = 10, bg = "white")

И теперь ваша функция click может получить все три значения:

def click():
    n = n_entry.get()
    m = m_entry.get()
    operation = operation_entry.get()

Конечно, это будут строки - в точности как то, что вы получаете от вызова input() в приложении командной строки. Таким образом, вы должны сделать то же самое здесь - вызвать int или float для них, обработать ошибки и т. Д.

Но как только вы это сделаете, остальная часть click может быть вашим существующим закомментированным кодом. (За исключением того, что вам нужно избавиться от этих break утверждений - отсюда нет цикла, который можно было бы вырвать.)

    if operation == 1:
        print(n + m)
    elif operation == 2:
        print(n - m)
    # etc.

Однако вы можете изменить эти print вызовы, чтобы вместо этого отображать результат в графическом интерфейсе. Например, у вас может быть пустой Label с именем results_label, и его текст должен быть str(n+m) и т. Д.

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