Некоторые строки кода не выполняются в функции - PullRequest
0 голосов
/ 22 октября 2018

Я делаю простой калькулятор, используя tkinter, но с моей функцией add () он не меняет значение переменной оператора и не извлекает значение для number1.Это странно для меня, потому что команда e.delete прекрасно работает в функции add ().Заранее спасибо за помощь.Вот код:

from tkinter import*

def one():
    e.insert(END, '1')
def add():
    operator = 1
    number1=int(e.get())
    e.delete(0,END)
def equal():
    number2=int(e.get())
    if (operator==1):
        result=int(number1+number2)
        e.delete(0,END)
        e.insert(END,result)

win = Tk()
win.geometry('200x300')
win.title('Calculator')
operator = int(0)
e = Entry(win, width=25)
e.grid(column=1, row=0)
Btn1= Button(win, text='1', command=one, height=2, width=4)
Btn1.grid(column=1, row=1)
addBtn= Button(win, text='+', command=add, height=1, width=2)
addBtn.grid(column=4, row=1)
equalBtn= Button(win, text='=', command=equal, height=1, width=2)
equalBtn.grid(column=4, row=2)

win.mainloop()

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я думаю, что проблема в области действия ваших переменных.В Python можно убедиться, что код обрабатывает переменную как глобальную переменную, используя ключевое слово global.В противном случае область видимости переменной относится только к этой функции - то есть она имеет только локальную область видимости, что делает ее локальной переменной - таким образом, она существует только внутри этой функции.Python делает все возможное, чтобы автоматически определить, что является локальным, а что глобальным, но использование ключевого слова global обеспечивает это.

Таким образом, похоже, что ваша переменная number1 имела только локальную область видимости.Эта версия работает для меня.Я могу добавить 1 с 11, чтобы получить 12.

from tkinter import*

number1  = 0
number2  = 0
operator = 0

def one():
    global e
    e.insert(END, '1')

def add():
    global e, operator, number1
    operator = 1
    number1  = int(e.get())
    e.delete(0,END)

def equal():
    global e, operator, number1, number2
    number2 = int(e.get())
    if (operator == 1):
        result = int(number1+number2)
        e.delete(0,END)
        e.insert(END,result)

win = Tk()
win.geometry('200x300')
win.title('Calculator')
e = Entry(win, width=25)
e.grid(column=1, row=0)
Btn1= Button(win, text='1', command=one, height=2, width=4)
Btn1.grid(column=1, row=1)
addBtn= Button(win, text='+', command=add, height=1, width=2)
addBtn.grid(column=4, row=1)
equalBtn= Button(win, text='=', command=equal, height=1, width=2)
equalBtn.grid(column=4, row=2)

win.mainloop()

Кстати: ваши кнопки не появлялись в окне для меня, пока оно не развернулось.Возможно, эта сетка немного неправильна или окно слишком маленькое.

Кроме того, всякий раз, когда вы используете конвертер int() для строки, существует очень реальная вероятность того, что она потерпит неудачу (как всякий раз, когда запись eпустой).Это хорошая практика для обработки всех этих ошибок.Возможно, напишите одну функцию для проверки ввода и обработки ошибок, используя ее вместо int()

0 голосов
/ 22 октября 2018

Похоже, вам нужно объявить некоторые из ваших переменных функции глобальными, чтобы они ссылались на одно и то же.Обычно переменные будут ограничены функцией, в которой они находятся.

def add():
    global operator
    operator = 1
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...