某些代码行未在函数中执行

时间:2018-10-22 03:04:59

标签: python python-3.x tkinter

我正在使用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 :(得分:0)

我认为问题出在您变量的作用域上。在Python中,可以通过使用global关键字来确保代码将变量作为全局变量处理。否则,变量的作用域仅针对该函数-意味着它仅具有局部作用域,从而使其成为局部变量-因此,它仅存在于该函数内部。 Python最好自动确定本地内容和全局内容,但是使用global关键字可以确保这一点。

因此,看来您的number1变量只具有局部作用域。这个版本适合我。我可以将111添加到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()

答案 1 :(得分:-1)

看起来您需要将一些函数变量声明为全局变量,因此它们引用的是同一件事。通常,变量的作用域将限于它们所在的函数。

switch (duration) {
  case duration.days === 0 && duration.hours === 0 && duration.minutes 
=== 0 && duration.seconds === 0:
// change all opacities
    break;
  case duration.days === 0 && duration.hours === 0 && duration.minutes === 0:
// change days, hours and minute opacities
    break;
  case duration.days === 0 && duration.hours === 0
  default:
// change days and hours opacities
}