В tkinter, почему комбинация IntVar / Entry возвращает неверное целое число при использовании заполнения нулями?

1

При использовании IntVar для получения содержимого виджета Entry результат неверен, когда целое число остается нулевым. Например, если поле ввода содержит "05000", значение IntVar равно 2560.

Эту проблему можно легко решить, не используя IntVar и перебирая целое число непосредственно в python int(entry.get()). Мне просто интересно, что вызывает эту проблему; Я не понимаю, какая именно ошибка происходит.

Ниже примера игрушки, воспроизводящего проблему:

import tkinter as tk

def print_values():
    print("Value 0 - entry: '{}' - integer: {}".format(entry0.get(), int0.get()))
    print("Value 1 - entry: '{}' - integer: {}".format(entry1.get(), int1.get()))

if __name__ == "__main__":
    root = tk.Tk()

    int0 = tk.IntVar(root, 5)
    tk.Label(root, text="Value 0").grid(row=0, column=0)
    entry0 = tk.Entry(root, textvariable=int0)
    entry0.insert(0, "0000")
    entry0.grid(row=0, column=1)

    int1 = tk.IntVar(root, 5)
    tk.Label(root, text="Value 1").grid(row=1, column=0)
    entry1 = tk.Entry(root, textvariable=int1)
    entry1.insert(0, "0")
    entry1.insert("end", "000")
    entry1.grid(row=1, column=1)

    tk.Button(root, text="Print", command=print_values).grid(row=2, column=1)

    print_values()
    root.mainloop()

Значение "00005" правильное, а значение "05000" - нет.

Теги:
tkinter

1 ответ

5
Лучший ответ

Это потому, что числа с ведущими нулями интерпретируются как восьмеричные. Таким образом, 05000 составляет 8 ^ 3 * 5. То же самое происходит для меня в переводчике:

Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 05000
2560
  • 0
    Спасибо, я не знал этот префикс для восьмеричного. Немного удивительно, что это происходит в python3, где восьмеричный префикс - «0o».
  • 0
    Я согласен. Но это может быть связано с тем, что библиотека tkinter практически не требует обслуживания. Возможно, стоит оставить сообщение об ошибке, поскольку, по-моему, оно также должно было измениться с новым префиксом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню