Эта крошечная программа Tkinter работает в Python 2 и 3, но почему странное поведение в Python 3? - PullRequest
0 голосов
/ 30 октября 2019

Впервые для Tkinter я «написал» приведенный ниже код, чтобы нарисовать страницу бумаги в клетку со жирными линиями с интервалами в 10 квадратов.

В Python 2 работает нормально (с изменением «tkinter»)в «Ткинтер»). В Python 3 он работает, но ободрение применяется только к вертикальным линиям.

Не самая насущная проблема в мире, я надеюсь, что это может вызвать интерес, соответствующий моему собственному любопытству ...

'''
    SquaredPaper app, based on Canvas example from 
    http://effbot.org/tkinterbook/tkinter-index.htm
'''
# CONSTANTS
A4Hmm = 297
A4Wmm = 210
PXperMM = 3
A4_HEIGHT = A4Hmm * PXperMM
A4_WIDTH  = A4Wmm * PXperMM
SQUARE_SIDE = 5*PXperMM
NSQUARES_H = A4_HEIGHT/SQUARE_SIDE
NSQUARES_W = A4_WIDTH/SQUARE_SIDE 

from tkinter import *

master = Tk()

w = Canvas(master, width=A4_WIDTH, height=A4_HEIGHT)
w.pack()
paper = w.create_rectangle(0, 0, A4_WIDTH, A4_HEIGHT)

count = NSQUARES_H
pos = 0
while count > 0:
    lw = 1 if count%10 else 2
    w.create_line(0, pos, A4_WIDTH, pos, width=lw)
    pos += SQUARE_SIDE

    count -= 1

count = NSQUARES_W
pos = 0
while count > 0:
    lw = 1 if count%10 else 2
    w.create_line(pos, 0, pos, A4_HEIGHT, width=lw)
    pos += SQUARE_SIDE

    count -= 1



mainloop()

1 Ответ

2 голосов
/ 30 октября 2019

Проблема возникает из-за того, что деление обрабатывается в каждой версии.

В Python 2.7 оператор деления / выводит значение integer , если2 входа являются целыми числами.

Принимая во внимание, что в Python 3 возвращается значение float для того же самого.

Это делает код пригодным для использования в Python 2.7, а не в3, поскольку переменная NSQUARES_H возвращается как float и, следовательно, условие else в lw = 1 if count%10 else 2 никогда не выполняется.

Если вы хотите запустить то же самое в Python 3, roundзначение NSQUARES_H или преобразовать его в int

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